C语言的文件输入\输出
发布日期:2021-06-29 11:14:20
浏览次数:2
分类:技术文章
本文共 4534 字,大约阅读时间需要 15 分钟。
fopen它的第1个参数是待打开文件的名称,更确切地说是一个包含该文件名的字符串地址。
getc()和putc()函数与getchar()和putchar()函数类似ch = getc(fp);//从指定的文件中获取一个字符putc(ch, fpout);// 把字符ch放入FILE指针fpout指定的文件中putc(ch, stdout)与putchar(ch)的作用相同。//stdout作为与标准输出相关联的文件指针#include#include #include #include int main() { int ch; FILE * fp; fp = fopen("asd.txt", "r"); while ((ch = getc(fp)) != EOF) { putchar(ch); } fclose(fp);// 如果成功关闭,fclose()函数返回0,否则返回EOF return 0;}实列:#include #include #include #include #define LEN 40int main() { FILE * in, * out; //指向输出输入文件的文件指针 int ch, count = 0; //ch存储字符, count标记只读位置为3的倍数的字符 char fileName[] = "test.txt"; if ((in = fopen(fileName, "r")) == NULL) { fprintf(stderr, "I couldn't open the file \"%s\"\n", fileName); } if ((out = fopen("test2.txt", "w")) == NULL) { fprintf(stderr, "Can't create output file.\n"); }else { //getc一个一个读取字符 //putc一个一个输出字符 while ((ch = getc(in)) != EOF) { if (count++ % 3 == 0) { putchar(ch); putc(ch, out); } } } fclose(in), fclose(out); return 0;}文件I/O函数fprintf()和fscanf()函数的工作方式与printf()和scanf()类似,区别在于前者需要用第1个参数指定待处理的文件rewind()函数的用法实列:#include #include #include #include #define MAX 41int main() { //fprintf, fscanf, rewind FILE * fp; char words[MAX]; if ((fp = fopen("wordy", "a+")) == NULL) { fprintf(stdout, "Can't open \"wordy\" file.\n"); } puts("Enter words to add to the file; press the #"); puts("key at the beginning of a line to terminate."); while ((fscanf(stdin, "%40s", words) == 1) && (words[0] != '#')) { //最大读入40个字符 fprintf(fp, "%s\n", words); } puts("File contents:"); rewind(fp);//返回到文件开始出 while (fscanf(fp, "%s", words) == 1) puts(words); puts("Done!"); if (fclose(fp) != 0) { fprintf(stderr, "Error closing file\n"); } return 0;}fgets和fputsfgets(buf, STLEN, fp);第1个参数和gets()函数一样,也是表示储存输入位置的地址(char * 类型)、第2个参数是一个整数,表示待输入字符串的大小、最后一个参数是文件指针,指定待读取的文件。fgets()函数读取输入直到第 1 个换行符的后面,或读到文件结尾,或者读取STLEN-1 个字符(以上面的 fgets()为例)。然后,fgets()在末尾添加一个空字符使之成为一个字符串。字符串的大小是其字符数加上一个空字符。如果fgets()在读到字符上限之前已读完一整行,它会把表示行结尾的换行符放在空字符前面。fgets()函数在遇到EOF时将返回NULL值,可以利用这一机制检查是否到达文件结尾;如果未遇到EOF则之前返回传给它的地址fputs(buf, fp);fputs()函数接受两个参数:第1个是字符串的地址;第2个是文件指针。该函数根据传入地址找到的字符串写入指定的文件中。和 puts()函数不同,fputs()在打印字符串时不会在其末尾添加换行符。fseek()和ftell()有了 fseek()函数,便可把文件看作是数组,在 fopen()打开的文件中直接移动到任意字节处。我们创建一个程序演示fseek()和ftell()的用法。注意,fseek()有3个参数,返回int类型的值;ftell()函数返回一个long类型的值,表示文件中的当前位置。#include #include #include #include #define CNTL_Z '\032'// DOS文本文件中的文件结尾标记#define SLEN 81//倒序输出文件内容 int main() { char file[SLEN]; char ch; FILE * fp; long count, last; puts("Enter the name of the file to be processed:"); scanf("%80s", file); if ((fp = fopen(file, "rb")) == NULL) { printf("reverse can't open %s\n", file); } fseek(fp, 0L, SEEK_END);//定位到文件末尾 last = ftell(fp); for (count = 1L; count <= last; count++) { fseek(fp, -count, SEEK_END);//回退 ch = getc(fp); if (ch != CNTL_Z && ch != '\r') putchar(ch);//MS-DOS 文件 } putchar('\n'); fclose(fp); return 0;}fseek()的第2个参数是偏移量(offset)。该参数表示从起始点开始要移动的距离(参见下表列出的起始点模式)。该参数必须是一个long类型的值,可以为正(前移)、负(后移)或0(保持不动)。fseek()的第3个参数是模式,该参数确定起始点。fgetpos()和fsetpos()新增了两个处理较大文件的新定位函数
一些IO函数int ungetc()函数把c指定的字符放回输入流中。int fflush(FILE *fp); 调用fflush()函数引起输出缓冲区中所有的未写入数据被发送到fp指定的输出文件。这个过程称为刷新缓冲区。如果 fp是空指针,所有输出缓冲区都被刷新。在输入流中使用fflush()函数的效果是未定义的。只要最近一次操作不是输入操作,就可以用该函数来更新流(任何读写模式)。fread()和fwrite()函数:fread()和 fwrite函数用于以二进制形式处理数据,实际上,所有的数据都是以二进制形式储存的,甚至连字符都以字符码的二进制表示来储存。如果文件中的所有数据都被解释成字符码,则称该文件包含文本数据。如果部分或所有的数据都被解释成二进制形式的数值数据,则称该文件包含二进制数据(另外,用数据表示机器语言指令的文件都是二进制文件)。size_t fwrite(const void * restrict ptr, size_t size, size_t nmemb,FILE * restrictfp);fwrite()函数把二进制数据写入文件。size_t是根据标准C类型定义的类型,它是sizeof运算符返回的类型,通常是unsigned int,但是实现可以选择使用其他类型。指针ptr是待写入数据块的地址。size表示待写入数据块的大小(以字节为单位),nmemb表示待写入数据块的数量。和其他函数一样,fp指定待写入的文件。例如,要保存一个大小为256字节的数据对象(如数组),可以这样做:char buffer[256];fwrite(buffer, 256, 1, fp);size_t fread(void * restrict ptr, size_t size, size_t nmemb,FILE * restrict fp);fread()函数接受的参数和fwrite()函数相同。在fread()函数中,ptr是待读取文件数据在内存中的地址,fp指定待读取的文件。double buffer[256];fread(earnings, 256, 1, fp);feof()和ferror()函数用于区分这两种情况。当上一次输入调用检测到文件结尾时,feof()函数返回一个非零值,否则返回0。当读或写出现错误,ferror()函数返回一个非零值,否则返回0。#include#include #include #include int main() { char buff[100] = "123456789"; char buff2[100]; double a, b; a = 1.0/3.0; FILE * fp; fp = fopen("test", "a+"); fwrite(buff, 99, 1, fp); fwrite(&a, sizeof(double), 1, fp); fclose(fp); fp = fopen("test", "r"); fread(buff2, 99, 1, fp); fread(&b, sizeof(double), 1, fp); printf("%s\n", buff2); printf("%lf\n", b); fclose(fp); return 0;}
转载地址:https://blog.csdn.net/ZWHSOUL/article/details/80607852 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
能坚持,总会有不一样的收获!
[***.219.124.196]2024年04月23日 02时23分42秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
电气毕业生在国家电网都干啥工作?
2019-04-29
为什么LED灯会越用越暗?
2019-04-29
为什么说卷积神经网络,是深度学习算法应用最成功的领域之一?
2019-04-29
在电网工作,有多高大上?
2019-04-29
「2020年大学生电子设计竞赛分享」电源题,省一等奖!
2019-04-29
又一国产开源微内核操作系统上线!源代码已开放下载
2019-04-29
10年老兵!从大学毕业生到嵌入式系统工程师的修炼之道……
2019-04-29
如何才能学好单片机?
2019-04-29
一根网线有这么多“花样”,你知道吗?
2019-04-29
雷军1994年写的诗一样的代码,我把它运行起来了!
2019-04-29
2020年大学生电子设计竞赛,B题,单相在线式不间断电源,详细技术方案!
2019-04-29
大佬终于把鸿蒙OS讲明白了,收藏了!
2019-04-29
C语言指针,这可能是史上最干最全的讲解啦(附代码)!!!
2019-04-29
国内大陆有哪些芯片公司处于世界前10?一起看看!
2019-04-29
单精度、双精度、多精度和混合精度计算的区别是什么?
2019-04-29
中国35位“大国工匠”榜单出炉!西工大、西电合计占半壁江山!清华仅1人!...
2019-04-29
知乎热议:嵌入式开发中C++好用吗?
2019-04-29
2020,Python 已死?
2019-04-29
漫画:程序员相亲?哈哈哈哈哈哈
2019-04-29
30种EMC标准电路分享,再不收藏就晚了!
2019-04-29