c语言文件操作

article/2025/3/15 17:09:20

文件操作读写

1 文件处理原理及基本概念

C语言的文件处理功能,大体上分为两种:一种是设置缓冲区,另一种是不设置缓冲区。因为不设置缓冲区的方法直接对磁盘进行操作,速度较慢,并且由于不是C的标准函数,跨平台操作时容易出问题。本文只介绍设置缓冲区的文件处理方式:

当使用包含在头文件stdio.h中的标准I/O函数时,系统会自动设置缓冲区,并通过数据流来读写文件。当进行文件读取时,不会直接对磁盘进行读取,而是先打开数据流,将磁盘上的文件信息拷贝到缓冲区内,然后程序再从缓冲区中读取所需数据。

1.1 相关概念

数据流:指程序与数据的交互是以流的形式进行的。进行C语言文件的存取时,都会先进行“打开文件”操作,这个操作就是在打开数据流,而“关闭文件”操作就是关闭数据流。

缓冲区:指在程序执行时,所提供的额外内存,可用来暂时存放做准备执行的数据。它的设置是为了提高存取效率,因为内存的存取速度比磁盘驱动器快得多。

1.2 文件类型

介绍下文本文件和二进制文件,

文本文件:是以字符编码的方式进行保存的。

二进制文件:将内存中数据原封不至文件中,如果以记事本打开,只会看到一堆乱码。二进制文件的优点在于存取速度快,占用空间小,以及可随机存取数据。

2 文件操作函数

2.1 打开文件

您可以使用 fopen( ) 函数来创建一个新的文件或者打开一个已有的文件,这个调用会初始化类型 FILE 的一个对象,类型 FILE 包含了所有用来控制流的必要的信息。下面是这个函数调用的原型:

FILE *fopen( const char * filename, const char * mode );

filename 是字符串,代表文件名。Mode为文件的打开模式。何为打开模式?下面列出:

模式

描述

r

打开一个已有的文本文件,允许读取文件。

w

打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。

a

打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。

r+

打开一个文本文件,允许读写文件。

w+

打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。

a+

打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。

注:打开二进制文件的模式与打开文本文件是一样的,不同的是模式名称里面多一个字母'b’,以表示以二进制形式打开文件。

举例说明:

FILE *fp = NULL;

fp = fopen("/tmp/test.txt", "w+");

2.2 关闭文件

关闭文件,请使用 fclose() 函数。函数的原型如下:

 int fclose( FILE *fp );

如果成功关闭文件,fclose( ) 函数返回零,如果关闭文件时发生错误,函数返回 EOF。这个函数实际上,会清空缓冲区中的数据,关闭文件,并释放用于该文件的所有内存。EOF 是一个定义在头文件 stdio.h 中的常量。

 

例子:

FILE *fp = NULL;

fp = fopen("/tmp/test.txt", "w+");

fclose(fp);

 

2.3 读写文本文件

(1) 按照字符读写

下面是从文件读取单个字符函数:

int fgetc( FILE * fp );

函数fgetc()从fp所指向的输入文件中读取一个字符。返回值是读取的字符,如果发生错误则返回EOF

下面是写入单字符的函数:

int fputc( int c, FILE *fp );

函数fputc()把参数c的字符值写入到fp所指向的输出流中。如果写入成功,它会返回写入的字符,如果发生错误,则会返回EOF。

(2) 按照字符串读写

下面是从文件读取字符串函数

char *fgets( char *buf, int n, FILE *fp );

函数 fgets() 从 fp 所指向的输入流中读取 n - 1 个字符。它会把读取的字符串复制到缓冲区,并在最后追加一个 null 字符来终止字符串。

例子:fgets(buff, 255, fp);

下面是从文件写入字符串函数:

int fputs( const char *s, FILE *fp );

举例说明:

fputs("YangLaoShi zui shuai", fp)

 

函数 fputs() 把字符串 s 写入到 fp 所指向的输出流中。如果写入成功,它会返回一个非负值,如果发生错误,则会返回 EOF

(3)格式化存取(重点掌握)

int fscanf(FILE *fp,const char *format)

int fprintf(FILE *fp,const char *format)

它们与printf和scanf函数相仿,都是格式化读写函数,用法也相似。不同之处在于fscanf和fprintf函数是将fp指向的文件作为缓冲区,进行输入输出。

例子:

FILE * fp = fopen("txt_out.txt","w");

例如我们想写入成绩:

fprintf(fp, "%-20.20s %-20.20s %-20.20s %-20.20s %-20.20s %-20.20s %-20.20s\n", "学号", "姓名", "性别", "C语言", "语文", "数学", "英语");

while (i < num)

{

fprintf(fp, "%-20s %-20s %-20s %-20d %-20d %-20d %-20d\n", Pst[i].studentid, Pst[i].name, Pst[i].sex, Pst[i].Cscore, Pst[i].Lscore, Pst[i].Mscore, Pst[i].Escore);

++i;

}

或者获取成绩:

fp = fopen("./student.txt", "r")

fscanf(fp, "%20s %20s %20s %20s %20s %20s %20s", Firstline[0], Firstline[1], Firstline[2], Firstline[3], Firstline[4], Firstline[5], Firstline[6]);

while (fscanf(fp, "%20s %20s %20s %20d %20d %20d %20d", Pst[i].studentid, Pst[i].name, Pst[i].sex, &Pst[i].Cscore, &Pst[i].Lscore, &Pst[i].Mscore, &Pst[i].Escore) != EOF)

{

i++;

}

具体细节请自行百度

2.4 读写二进制文件

当要求一次存取一组数据(如,一个数组、一个结构体变量的值),fread和fwrite函数可以解决该类问题。它们的调用形式一般为:

fread(buffer, size, count, fp);
fwrite(buffer, size, count, fp);

buffer:对于fread来说,指的是读入数据的存放地址;对于fwrite来说,是要输出数据的地址。
size:读写数据时,每笔数据的大小
count:读写数据的笔数
fp:文件指针

例子:

fread(pos,sizeof(double),200,fid);

fwrite(pos,sizeof(double),1,fid);//pos为数组名

 

2.5练习

我们结合所学知识写出部分代码:

//Txt写入
void TxtWrite()
{//准备数据int index[50] ;double x_pos[50], y_pos[50];for(int i = 0; i < 50; i ++ ){index[i] = i;x_pos[i] = rand()%1000 * 0.01;y_pos[i] = rand()%2000 * 0.01;}//写入FILE * fid = fopen("txt_out.txt","w");if(fid == NULL){printf("写出文件失败!\n");return;}for(int i = 0; i < 50; i ++ )fprintf(fid,"%03d\t%4.6lf\t%4.6lf\n",index[i],x_pos[i],y_pos[i]);fclose(fid);
}//Txt读取
void TxtRead()
{FILE * fid = fopen("txt_out.txt","r");if(fid == NULL){printf("打开%s失败","txt_out.txt");return;}char line[1024];memset(line,0,1024);while(!feof(fid)){fgets(line,1024,fid);printf("%s\n", line); //输出}fclose(fid);
}//二进制文件写入
void DataWrite()
{//准备数据double pos[200];for(int i = 0; i < 200; i ++ )pos[i] = i;//写入FILE *fid;fid = fopen("binary.dat","wb");if(fid == NULL){printf("写出文件出错");return;}fwrite(pos, sizeof(double), 200, fid);fclose(fid);
}//二进制文件读取
void DataRead()
{FILE *fid;
double pos[200];fid = fopen("binary.dat","rb");if(fid == NULL){printf("读取文件出错");return;}fread(pos,sizeof(double),200,fid);for(int i = 0; i < 200; i++)printf("%lf\n", pos[i]);fclose(fid);
}

 

 

 

 


http://chatgpt.dhexx.cn/article/8pXT7uMs.shtml

相关文章

无人机视角展示(无人机图像定位 )--某数学建模A题MATLAB代码

近期没啥空&#xff0c;水个简单的。。。。 目前只写了第一问&#xff0c;有空再写。。。。。 问题描述 无人驾驶飞机简称“无人机”&#xff0c;是利用无线电遥控设备和自备的程序控制装置操纵的不载人飞机。搭载图像设备的无人机在高空航拍、区域巡视、军事侦查等方面有广泛…

2020 全国大学生数学建模竞赛C题思路+代码

题目链接&#xff1a;天翼云盘 珍藏美好生活 家庭云|网盘|文件备份|资源分享 前言 又是一年数据挖掘题型&#xff0c;第一次接触这种题型还是在去年的mathorcup上&#xff0c;这种题的难度就在于指标的建立和数据的处理上。后面会出一份关于数据挖掘题型&#xff0c;我的相关经…

PU learning半监督学习

半监督学习 Positive-unlabeled learning 什么是半监督学习 让学习器不依赖外界交互、自动地利用未标记样本来提升学习性能&#xff0c;就是半监督学习&#xff08;semi-supervised learning&#xff09;。 要利用未标记样本&#xff0c;必然要做一些将未标记样本所揭示的数…

详解基于图卷积的半监督学习

Kipf和Welling最近发表的一篇论文提出&#xff0c;使用谱传播规则&#xff08;spectral propagation&#xff09;快速近似spectral Graph Convolution。 和之前讨论的求和规则和平均规则相比&#xff0c;谱传播规则的不同之处在于聚合函数。它使用提升到负幂的度矩阵D对聚合进行…

【半监督医学图像分割 2023】RCPS

文章目录 【半监督医学图像分割 2023 】RCPS摘要1. 介绍2. 相关工作2.1 医学图像分割2.1 半监督学习2.3 对比学习 3. 方法3.1 整体概述3.2 纠正伪监督3.3 双向Voxel对比学习。 4. 实验 【半监督医学图像分割 2023 】RCPS 论文题目&#xff1a;RCPS: Rectified Contrastive Pseu…

半监督之数据增强

目录 前言 传统常见的 Free Lunch for Few-shot Learning: Distribution Calibration Learning to Augment for Data-Scarce Domain BERT Knowledge Distillation MixText: Linguistically-Informed Interpolation of Hidden Space for Semi-Supervised Text Classificati…

半监督的语义分割

现阶段传统的语义分割已经逐渐走向瓶颈&#xff0c;你设计一个网络&#xff0c;修改一下U-Net增加一个模块&#xff0c;现在已经很难再出优秀的成果&#xff0c;大家对你的创新程度认可度也越来越低。所以现在大家在进行语义分割的时候往往需要自行创造出一些需求&#xff0c;比…

半监督学习介绍

转载地址 https://blog.csdn.net/ice110956/article/details/13775071 什么是半监督学习? 传统的机器学习技术分为两类&#xff0c;一类是无监督学习&#xff0c;一类是监督学习。 无监督学习只利用未标记的样本集&#xff0c;而监督学习则只利用标记的样本集进行学习。 但…

半监督目标检测相关方法总结

戳我&#xff0c;查看GAN的系列专辑~&#xff01; 等你着陆&#xff01;【GAN生成对抗网络】知识星球&#xff01; 作者丨kinredon知乎 编辑丨极市平台 来源丨https://zhuanlan.zhihu.com/p/404160115 近期阅读了一些半监督目标检测&#xff08;Semi-Supervised Object Detecti…

半监督深度学习

个人博客&#xff1a;wyxogo.top 半监督学习 在有标签数据无标签数据混合成的训练数据中使用的机器学习算法。一般假设&#xff0c;无标签数据比有标签数据多&#xff0c;甚至多得多。 要求&#xff1a; 无标签数据一般是有标签数据中的某一个类别的&#xff08;不要不属于的…

半监督学习深度学习算法

该文章主体摘自知乎糯米稻谷的文章&#xff0c;对一些细节添加了自己的理解 文章链接https 半监督学习 啥是半监督学习&#xff08;Semi-supervised Learning&#xff09;1.简单自训练&#xff08;simple self-training&#xff09;2.协同训练&#xff08;co-training&#xff…

深度半监督学习方法总结

深度神经网络已被证明在对大量标记数据进行监督学习的训练中是非常有效的。 但是大多数现实世界的数据并没有被标记&#xff0c;并且进行全部标记也是不太现实的&#xff08;需要大量的资源、时间和精力&#xff09;。 为了解决这个问题半监督学习 ( semi-supervised learning)…

深度半监督学习

半监督学习介绍 Zhu X, Goldberg A B. Introduction to semi-supervised learning[J]. Synthesis lectures on artificial intelligence and machine learning, 2009, 3(1): 1-130. 链接半监督 无监督学习&#xff1a;主要目的是从独立同分布采样中得到的n个独立样本中找到in…

半监督SVM

半监督SVM 什么是半监督学习半监督SVM要做什么TSVM 这里是阅读周志华的《机器学习》中关于半监督SVM&#xff08;S3VM&#xff09;的笔记。 什么是半监督学习 在数据的搜集中&#xff0c;获得标记数据的成本是高昂的&#xff0c;而获得未标记的数据则是低廉的&#xff0c;为此…

半监督学习代码实战

sklearn官方例子——用半监督学习做数字识别 什么是半监督学习 半监督学习很重要&#xff0c;为什么呢&#xff1f;因为人工标注数据成本太高&#xff0c;现在大家参加比赛的数据都是标注好的了&#xff0c;那么如果老板给你一份没有标注的数据&#xff0c;而且有几百万条&am…

半监督学习综述

Chapter 7 Semi-supervised Learning 翻译不易&#xff0c;未经允许请勿转载&#xff01; Author: Mohamed Farouk Abdel Hady and Friedhelm Schwenker Translator: Howard Wonanut 摘要 传统的监督学习方法需要使用有标签数据建立模型。然而&#xff0c;在现实世界中给训练…

半监督学习(一)

什么是半监督学习? 传统的机器学习技术分为两类&#xff0c;一类是无监督学习&#xff0c;一类是监督学习。 无监督学习只利用未标记的样本集&#xff0c;而监督学习则只利用标记的样本集进行学习。 但在很多实际问题中&#xff0c;只有少量的带有标记的数据&#xff0c;因为…

半监督学习简介

“我们预计从长远来看&#xff0c;无监督学习将变得更加重要。人类和动物的学习在很大程度上是不受监督的&#xff1a;我们通过观察来发现世界的结构&#xff0c;而不是通过被告知每个物体的名称。”——LeCun, Bengio, Hinton, Nature (2015)。 Semi-Supervised Learning 半监…

半监督学习

1. 介绍 1.1 什么是半监督学习 所给的数据有的是有标签的&#xff0c;而有的是没有标签的。常见的两种半监督的学习方式是直推学习&#xff08;Transductive learning&#xff09;和归纳学习&#xff08;Inductive learning&#xff09;。   直推学习&#xff08;Transduct…

半监督学习(SEMI-Supervised Learning)

半监督学习的工作原理 想象一下&#xff0c;收集了大量未标记的数据&#xff0c;您想在这些数据上训练模型。手动标记所有这些信息可能会花费你一大笔钱&#xff0c;除了需要几个月的时间来完成注释。这时候半监督机器学习方法就派上用场了。工作原理很简单。无需将标签添加到…