4.1 文件的顺序读写
对于输入\输出函数的简单示例:
4,11 fputc函数
函数功能: fputc函数,按单个字符输出到流.
函数模型:
参数介绍:,
参数 | 含义 |
character | 要输入的字符(整形是因为会转化为ASCII码值) |
stream | 指向要输出到的流 |
‘w’,(只写)从内存写/输出数据到文件中
示例:
向文件写入26个小写英文字母,空格分隔
#include <stdio.h> int main() { FILE* pFile; //打开文件 pFile = fopen("123.txt", "w"); if (pFile != NULL) { for (char i = 'a'; i <= 'z'; i++) { fputc(i, pFile);//从内存中写到流 fputc(' ', pFile);//写入空格字符 } } else { printf("打开失败"); return 1;//返回非0 } //关闭文件 fclose(pFile); return 0; }
//123.txt a b c d e f g h i j k l m n o p q r s t u v w x y z
4.12 fgetc函数
函数功能: fgetc从流中读入数据到内存
函数模型
参数 | 含义 |
stream | 指向标识输入流的 FILE 对象的指针。 |
‘r’,(只读),从文件中读数据到内存
示例:
#include <stdio.h> int main() { FILE* pFile; char c; pFile = fopen("123.txt", "r");//此时123.txt中已经有26个字母了 if (pFile != NULL) { while ((c=fgetc(pFile))!=EOF)//从流中写读到内存,直到文件读取结束 { printf("%c",c); } } else { printf("打开失败"); return 1;//返回非0 } //关闭文件 fclose(pFile); return 0; }
运行结果:
4.13 fputs函数
函数功能: fputs将 str 指向流的 C 字符串写入流。
函数模型:
函数参数:
参数 | 含义 |
str | 要输入的字符串 |
stream | 指向标识输出流的 FILE 对象的指针。 |
注意:
该函数时按行进行写入字符串.可以在写数据时在后面增加一个换行符,会更加美观.
示例:
#include <stdio.h> int main() { FILE* pFile; char c; pFile = fopen("123.txt", "w");//此时123.txt中已经有26个字母了 if (pFile != NULL) { fputs("Hello World !!!\n", pFile); fputs("Hello CSDN!!!\n", pFile); fputs("Hello 初阶牛!!!\n", pFile); } else { printf("打开失败"); return 1;//返回非0 } //关闭文件 fclose(pFile); return 0; }
运行结果:
虽然之前文本里面已经有了26个英文字母,但是再进行写入操作时,会清空之前的文件内容.
‘a’,追加向文件末尾写数据.
怎样可以保留原来的数据,在数据后面继续增加新数据呢?
只需要将w改成a追加就行了.
pFile = fopen("123.txt", "a");//此时123.txt中已经有24个字母了,a表示追加 if (pFile != NULL) { fputs("\n", pFile);//添加换行 fputs("Hello World !!!\n", pFile); fputs("Hello CSDN!!!\n", pFile); fputs("Hello 初阶牛!!!\n", pFile); }
原文件中的数据↓
指向追加代码后:↓
4.14 fgets函数
函数功能:
从流中读取字符并将其作为 C 字符串存储到 str 中,直到读取 (num-1) 个字符或到达换行符或文件末尾,以先发生者为准。num-1是因’\0’要占一个字节.
函数模型:
函数参数:
参数 | 含义 |
str | 指向在其中复制字符串读取的字符数组的指针。 |
num | 要复制到 str 的最大字符数(包括终止空字符)。 |
stream | 指向标识输入流的 FILE 对象的指针。stdin 可以用作从标准输入读取的参数。 |
示例:
#include <stdio.h> int main() { FILE* pFile; char str[4][100]; pFile = fopen("123.txt", "r");//此时123.txt中已经有24个字母和3行hello ... if (pFile != NULL) { fgets(str[0], 55, pFile); fgets(str[1], 10, pFile); fgets(str[2], 20, pFile); fgets(str[3], 30, pFile); } else { printf("打开失败"); return 1;//返回非0 } //关闭文件 fclose(pFile); //打印 for (int i=0; i < 4; i++) { printf("%s\n", str[i]); } return 0; }
文件中的数据:
读到的数据:
解释:
fgets(str[0], 55, pFile);从文件第一行开始向后读取54个字符,但是还没有到54个字符时,先遇到了换行符,它使 fgets 停止读取,但它被函数视为有效字符,并包含在复制到 str 的字符串中。
并且,终止空字符会自动附加到复制到 str 的字符之后。
所以第一行打印:
a b c d e f g h i j k l m n o p q r s t u v w x y z
//这下面有两个换行,一个是printf(“%s\n”, str[i]);中的\n,还有一个是文件中的换行也被视作有效字符.
fgets(str[1], 10, pFile);第一行读取完毕之后,光标从下一行开始读取,读取10个字节,即10-1个有效数据(还有一个是’\0’).
运行结果:
Hello Wor
//一个换行,
fgets(str[2], 20, pFile);文件的第二行还未读取结束,则从r后面开始继续读取,20个字节,直到遇到换行.
同理,打印:
ld !!!
//这里两个换行,是printf(“%s\n”, str[i]);中的\n,
fgets(str[3], 30, pFile);这个从第三行开始,遇到换行结束
打印结果:
Hello CSDN!!!
//两个换行
4.15 fsacnf函数与fprintf函数
格式化输入输出函数是什么意思?
其实很简单,就是对于一些特殊格式的输入,比如输入一个保留两位小数的浮点型.
示例:从键盘得到数据,再将数据写入文件
输入:
初阶牛 20 1.755
typedef struct student { char name[10]; int age; float stature; }student; #include <stdio.h> int main() { FILE* pFile; student s1 ; fscanf(stdin, "%s%d%f",s1.name, &s1.age, &s1.stature);//从标准输入流(键盘)获取数据 //打开文件 pFile = fopen("123.txt", "w"); if (pFile != NULL) { fprintf(pFile, "%s %d %.2f",s1.name, s1.age, s1.stature);//将数据输出到文件 } else { printf("打开失败"); return 1;//返回非0 } //关闭文件 fclose(pFile); return 0; }
运行结果:
//123.txt
初阶牛 20 1.75
示例:从文件中读取数据输出到显示器(屏幕)
typedef struct student { char name[10]; int age; float stature; }student; #include <stdio.h> int main() { FILE* pFile; student s1; //打开文件 pFile = fopen("123.txt", "r");//此时文件中有数据:初阶牛 20 1.75 if (pFile != NULL) { fscanf(pFile, "%6s%2d%f", s1.name, &s1.age, &s1.stature);//从文件中读取数据 } else { printf("打开失败"); return 1;//返回非0 } //关闭文件 fclose(pFile); fprintf(stdout, "%6s %2d %.2f", s1.name, s1.age, s1.stature);//将数据输出到显示器 return 0; }
4.16 fread函数和fwrite函数
函数原型:
参数说明:
参数 | 含义 |
ptr | 指向要写入流的元素数组的指针 |
size | 要写入的每个元素的大小(以字节为单位) |
count | 元素个数 |
stream | 指向指定输出流的 FILE 对象的指针 |
图解: