c语言的文件读写操作:1、用fgetc()和fputc()函数以字符形式读写文件,语法“fgetc(文件指针);”和“fputc (要写入的字符,文件指针);”;2、用fgets()和fputs()函数以字符串的形式读写文件,语法“fgets (字符数组,读取个数,文件指针)”和“fputs(字符串,文件指针)”;3、用fread()和fwrite()以数据块的形式读写文件。
本教程操作环境:windows7系统、c99版本、Dell G3电脑。
在C语言中,读写文件比较灵活,既可以每次读写一个字符,也可以读写一个字符串,甚至是任意字节的数据(数据块)。
以字符形式读写文件
以字符形式读写文件时,每次可以从文件中读取一个字符,或者向文件中写入一个字符。主要使用两个函数,分别是 fgetc() 和 fputc()。
1、字符读取函数 fgetc
fgetc 是 file get char 的缩写,意思是从指定的文件中读取一个字符。fgetc() 的用法为:
int fgetc (FILE *fp);
fp 为文件指针。fgetc() 读取成功时返回读取到的字符,读取到文件末尾或读取失败时返回EOF。
EOF 是 end of file 的缩写,表示文件末尾,是在 stdio.h 中定义的宏,它的值是一个负数,往往是 -1。fgetc() 的返回值类型之所以为 int,就是为了容纳这个负数(char不能是负数)。
EOF 不绝对是 -1,也可以是其他负数,这要看编译器的实现。
fgetc() 的用法举例:
char ch; FILE *fp = fopen("D:\\demo.txt", "r+"); ch = fgetc(fp);
表示从D:\\demo.txt文件中读取一个字符,并保存到变量 ch 中。
在文件内部有一个位置指针,用来指向当前读写到的位置,也就是读写到第几个字节。在文件打开时,该指针总是指向文件的第一个字节。使用 fgetc() 函数后,该指针会向后移动一个字节,所以可以连续多次使用 fgetc() 读取多个字符。
注意:这个文件内部的位置指针与C语言中的指针不是一回事。位置指针仅仅是一个标志,表示文件读写到的位置,也就是读写到第几个字节,它不表示地址。文件每读写一次,位置指针就会移动一次,它不需要你在程序中定义和赋值,而是由系统自动设置,对用户是隐藏的。
【示例】在屏幕上显示 D:\\demo.txt 文件的内容。
#include<stdio.h> int main(){ FILE *fp; char ch; //如果文件不存在,给出提示并退出 if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){ puts("Fail to open file!"); exit(0); } //每次读取一个字节,直到读取完毕 while( (ch=fgetc(fp)) != EOF ){ putchar(ch); } putchar('\n'); //输出换行符 fclose(fp); return 0; }
在D盘下创建 demo.txt 文件,输入任意内容并保存,运行程序,就会看到刚才输入的内容全部都显示在屏幕上。
该程序的功能是从文件中逐个读取字符,在屏幕上显示,直到读取完毕。
程序第 13 行是关键,while 循环的条件为(ch=fgetc(fp)) != EOF。fget() 每次从位置指针所在的位置读取一个字符,并保存到变量 ch,位置指针向后移动一个字节。当文件指针移动到文件末尾时,fget() 就无法读取字符了,于是返回 EOF,表示文件读取结束了。
对 EOF 的说明:
EOF 本来表示文件末尾,意味着读取结束,但是很多函数在读取出错时也返回 EOF,那么当返回 EOF 时,到底是文件读取完毕了还是读取出错了?我们可以借助 stdio.h 中的两个函数来判断,分别是 feof() 和 ferror()。
feof() 函数用来判断文件内部指针是否指向了文件末尾,它的原型是:
int feof ( FILE * fp );
当指向文件末尾时返回非零值,否则返回零值。
ferror() 函数用来判断文件操作是否出错,它的原型是:
int ferror ( FILE *fp );
出错时返回非零值,否则返回零值。
需要说明的是,文件出错是非常少见的情况,上面的示例基本能够保证将文件内的数据读取完毕。如果追求完美,也可以加上判断并给出提示:
#include<stdio.h> int main(){ FILE *fp; char ch; //如果文件不存在,给出提示并退出 if( (fp=fopen("D:\\demo.txt","rt")) == NULL ){ puts("Fail to open file!"); exit(0); } //每次读取一个字节,直到读取完毕 while( (ch=fgetc(fp)) != EOF ){ putchar(ch); } putchar('\n'); //输出换行符 if(ferror(fp)){ puts("读取出错"); }else{ puts("读取成功"); } fclose(fp); return 0; }
这样,不管是出错还是正常读取,都能够做到心中有数。
2、字符写入函数 fputc
fputc 是 file output char 的所以,意思是向指定的文件中写入一个字符。fputc() 的用法为:
int fputc ( int ch, FILE *fp );
ch 为要写入的字符,fp 为文件指针。fputc() 写入成功时返回写入的字符,失败时返回 EOF,返回值类型为 int 也是为了容纳这个负数。例如:
fputc('a', fp);
或者:
char ch = 'a'; fputc(ch, fp);
表示把字符 'a' 写入fp所指向的文件中。
两点说明
1) 被写入的文件可以用写、读写、追加方式打开,用写或读写方式打开一个已存在的文件时将清除原有的文件内容,并将写入的字符放在文件开头。如需保留原有文件内容,并把写入的字符放在文件末尾,就必须以追加方式打开文件。不管以何种方式打开,被写入的文件若不存在时则创建该文件。
2) 每写入一个字符,文件内部位置指针向后移动一个字节。
【示例】从键盘输入一行字符,写入文件。
#include<stdio.h> int main(){ FILE *fp; char ch; //判断文件是否成功打开 if( (fp=fopen("D:\\demo.txt","wt+")) == NULL ){ puts("Fail to open file!"); exit(0); } printf("Input a string:\n"); //每次从键盘读取一个字符并写入文件 while ( (ch=getchar()) != '\n' ){ fputc(ch,fp); } fclose(fp); return 0; }
运行程序,输入一行字符并按回车键结束,打开D盘下的 demo.txt 文件,就可以看到刚才输入的内容。
程序每次从键盘读取一个字符并写入文件,直到按下回车键,while 条件不成立,结束读取。
以字符串的形式读写文件
fgetc() 和 fputc() 函数每次只能读写一个字符,速度较慢;实际开发中往往是每次读写一个字符串或者一个数据块,这样能明显提高效率。
1、读字符串函数 fgets
fgets() 函数用来从指定的文件中读取一个字符串,并保存到字符数组中,它的用法为:
char *fgets ( char *str, int n, FILE *fp );
str 为字符数组,n 为要读取的字符数目,fp 为文件指针。
返回值:读取成功时返回字符数组首地址,也即 str;读取失败时返回 NULL;如果开始读取时文件内部指针已经指向了文件末尾,那么将读取不到任何字符,也返回 NULL。
注意,读取到的字符串会在末尾自动添加 '\0',n 个字符也包括 '\0'。也就是说,实际只读取到了 n-1 个字符,如果希望读取 100 个字符,n 的值应该为 101。例如:
#define N 101 char str[N]; FILE *fp = fopen("D:\\demo.txt", "r"); fgets(str, N, fp);
表示从 D:\\demo.txt 中读取 100 个字符,并保存到字符数组 str 中。
需要重点说明的是,在读取到 n-1 个字符之前如果出现了换行,或者读到了文件末尾,则读取结束。这就意味着,不管 n 的值多大,fgets() 最多只能读取一行数据,不能跨行。在C语言中,没有按行读取文件的函数,我们可以借助 fgets(),将 n 的值设置地足够大,每次就可以读取到一行数据。
【示例】一行一行地读取文件。
#include <stdio.h> #include <stdlib.h> #define N 100 int main(){ FILE *fp; char str[N+1]; if( (fp=fopen("d:\\demo.txt","rt")) == NULL ){ puts("Fail to open file!"); exit(0); } while(fgets(str, N, fp) != NULL){ printf("%s", str); } fclose(fp); return 0; }
将下面的内容复制到 D:\\demo.txt:
PHP中文网 https://www.php.cn/
那么运行结果为:
fgets() 遇到换行时,会将换行符一并读取到当前字符串。该示例的输出结果之所以和 demo.txt 保持一致,该换行的地方换行,就是因为 fgets() 能够读取到换行符。而 gets() 不一样,它会忽略换行符。
2、写字符串函数 fputs
fputs() 函数用来向指定的文件写入一个字符串,它的用法为:
int fputs( char *str, FILE *fp );
str 为要写入的字符串,fp 为文件指针。写入成功返回非负数,失败返回 EOF。例如:
char *str = "http://c.biancheng.net"; FILE *fp = fopen("D:\\demo.txt", "at+"); fputs(str, fp);
表示把把字符串 str 写入到 D:\\demo.txt 文件中。
【示例】向上例中建立的 d:\\demo.txt 文件中追加一个字符串。
#include<stdio.h> int main(){ FILE *fp; char str[102] = {0}, strTemp[100]; if( (fp=fopen("D:\\demo.txt", "at+")) == NULL ){ puts("Fail to open file!"); exit(0); } printf("Input a string:"); gets(strTemp); strcat(str, "\n"); strcat(str, strTemp); fputs(str, fp); fclose(fp); return 0; }
运行程序,输入C C++ Java Linux Shell,打开 D:\\demo.txt,文件内容为:
以数据块的形式读写文件
fgets() 有局限性,每次最多只能从文件中读取一行内容,因为 fgets() 遇到换行符就结束读取。如果希望读取多行内容,需要使用 fread() 函数;相应地写入函数为 fwrite()。
对于 Windows 系统,使用 fread() 和 fwrite() 时应该以二进制的形式打开文件。
fread() 函数用来从指定文件中读取块数据。所谓块数据,也就是若干个字节的数据,可以是一个字符,可以是一个字符串,可以是多行数据,并没有什么限制。fread() 的原型为:
size_t fread ( void *ptr, size_t size, size_t count, FILE *fp );
fwrite() 函数用来向文件中写入块数据,fwrite() 函数的原型为:
size_t fwrite ( void * ptr, size_t size, size_t count, FILE *fp );
对参数的说明:
ptr 为内存区块的指针,它可以是数组、变量、结构体等。fread() 中的 ptr 用来存放读取到的数据,fwrite() 中的 ptr 用来存放要写入的数据。
size:表示每个数据块的字节数。
count:表示要读写的数据块的块数。
fp:表示文件指针。
理论上,每次读写 size*count 个字节的数据。
size_t 是在 stdio.h 和 stdlib.h 头文件中使用 typedef 定义的数据类型,表示无符号整数,也即非负数,常用来表示数量。
返回值:返回成功读写的块数,也即 count。如果返回值小于 count:
对于 fwrite() 来说,肯定发生了写入错误,可以用 ferror() 函数检测。
对于 fread() 来说,可能读到了文件末尾,可能发生了错误,可以用 ferror() 或 feof() 检测。
【示例】从键盘输入一个数组,将数组写入文件再读取出来。
#include<stdio.h> #define N 5 int main(){ //从键盘输入的数据放入a,从文件读取的数据放入b int a[N], b[N]; int i, size = sizeof(int); FILE *fp; if( (fp=fopen("D:\\demo.txt", "rb+")) == NULL ){ //以二进制方式打开 puts("Fail to open file!"); exit(0); } //从键盘输入数据 并保存到数组a for(i=0; i<N; i++){ scanf("%d", &a[i]); } //将数组a的内容写入到文件 fwrite(a, size, N, fp); //将文件中的位置指针重新定位到文件开头 rewind(fp); //从文件读取内容并保存到数组b fread(b, size, N, fp); //在屏幕上显示数组b的内容 for(i=0; i<N; i++){ printf("%d ", b[i]); } printf("\n"); fclose(fp); return 0; }
运行结果:
23 409 500 100 222↙ 23 409 500 100 222
打开 D:\\demo.txt,发现文件内容根本无法阅读。这是因为我们使用"rb+"方式打开文件,数组会原封不动地以二进制形式写入文件,一般无法阅读。
数据写入完毕后,位置指针在文件的末尾,要想读取数据,必须将文件指针移动到文件开头,这就是rewind(fp);的作用。更多关于rewind函数的内容请点击:C语言rewind函数。
文件的后缀不一定是 .txt,它可以是任意的,你可以自己命名,例如 demo.ddd、demo.doc、demo.diy 等。
【示例】从键盘输入两个学生数据,写入一个文件中,再读出这两个学生的数据显示在屏幕上。
#include<stdio.h> #define N 2 struct stu{ char name[10]; //姓名 int num; //学号 int age; //年龄 float score; //成绩 }boya[N], boyb[N], *pa, *pb; int main(){ FILE *fp; int i; pa = boya; pb = boyb; if( (fp=fopen("d:\\demo.txt", "wb+")) == NULL ){ puts("Fail to open file!"); exit(0); } //从键盘输入数据 printf("Input data:\n"); for(i=0; i<N; i++,pa++){ scanf("%s %d %d %f",pa->name, &pa->num,&pa->age, &pa->score); } //将数组 boya 的数据写入文件 fwrite(boya, sizeof(struct stu), N, fp); //将文件指针重置到文件开头 rewind(fp); //从文件读取数据并保存到数据 boyb fread(boyb, sizeof(struct stu), N, fp); //输出数组 boyb 中的数据 for(i=0; i<N; i++,pb++){ printf("%s %d %d %f\n", pb->name, pb->num, pb->age, pb->score); } fclose(fp); return 0; }
运行结果:
Input data: Tom 2 15 90.5↙ Hua 1 14 99↙ Tom 2 15 90.500000 Hua 1 14 99.000000
以上是c语言文件读写怎么操作的详细内容。更多信息请关注PHP中文网其他相关文章!

C#.NET依然重要,因为它提供了强大的工具和库,支持多种应用开发。1)C#结合.NET框架,使开发高效便捷。2)C#的类型安全和垃圾回收机制增强了其优势。3).NET提供跨平台运行环境和丰富的API,提升了开发灵活性。

C#.NETisversatileforbothwebanddesktopdevelopment.1)Forweb,useASP.NETfordynamicapplications.2)Fordesktop,employWindowsFormsorWPFforrichinterfaces.3)UseXamarinforcross-platformdevelopment,enablingcodesharingacrossWindows,macOS,Linux,andmobiledevices.

C#和.NET通过不断的更新和优化,适应了新兴技术的需求。1)C#9.0和.NET5引入了记录类型和性能优化。2).NETCore增强了云原生和容器化支持。3)ASP.NETCore与现代Web技术集成。4)ML.NET支持机器学习和人工智能。5)异步编程和最佳实践提升了性能。

c#.netissutableforenterprise-levelapplications withemofrosoftecosystemdueToItsStrongTyping,richlibraries,androbustperraries,androbustperformance.however,itmaynotbeidealfoross-platement forment forment forment forvepentment offependment dovelopment toveloperment toveloperment whenrawspeedsportor whenrawspeedseedpolitical politionalitable,

C#在.NET中的编程过程包括以下步骤:1)编写C#代码,2)编译为中间语言(IL),3)由.NET运行时(CLR)执行。C#在.NET中的优势在于其现代化语法、强大的类型系统和与.NET框架的紧密集成,适用于从桌面应用到Web服务的各种开发场景。

C#是一种现代、面向对象的编程语言,由微软开发并作为.NET框架的一部分。1.C#支持面向对象编程(OOP),包括封装、继承和多态。2.C#中的异步编程通过async和await关键字实现,提高应用的响应性。3.使用LINQ可以简洁地处理数据集合。4.常见错误包括空引用异常和索引超出范围异常,调试技巧包括使用调试器和异常处理。5.性能优化包括使用StringBuilder和避免不必要的装箱和拆箱。

C#.NET应用的测试策略包括单元测试、集成测试和端到端测试。1.单元测试确保代码的最小单元独立工作,使用MSTest、NUnit或xUnit框架。2.集成测试验证多个单元组合的功能,常用模拟数据和外部服务。3.端到端测试模拟用户完整操作流程,通常使用Selenium进行自动化测试。

C#高级开发者面试需要掌握异步编程、LINQ、.NET框架内部工作原理等核心知识。1.异步编程通过async和await简化操作,提升应用响应性。2.LINQ以SQL风格操作数据,需注意性能。3..NET框架的CLR管理内存,垃圾回收需谨慎使用。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

AI Hentai Generator
免费生成ai无尽的。

热门文章

热工具

Dreamweaver Mac版
视觉化网页开发工具

EditPlus 中文破解版
体积小,语法高亮,不支持代码提示功能

Atom编辑器mac版下载
最流行的的开源编辑器

VSCode Windows 64位 下载
微软推出的免费、功能强大的一款IDE编辑器

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)