一·文件的分类与认识:
首先我们要清楚我们写的文件存进去,可以按照普通的文本内容存进去还可以按照二进制的方式存进去。如果我们要想知道也就是说看到我们所写的内容是什么那么此时我们要写的就是文本内容,当然也可以写进去我们看不懂的二进制写法。
二·文件的打开与关闭:
1.这里我们来介绍一下如何打开以及关闭文件,打开文件的时候我们需要一个文件指针,接下来我们用代码来展示一下:
define _CRT_SECURE_NO_WARNINGS
include
int main() {
FILE* pf = fopen("test.txt", "w");//这里我们以写的形式打开这个文件,稍后会介绍到这些形式的具体
if (pf == NULL) {//这里我们会看出来如果文件能被成功打开它会返回一个文件指针;否则就会返回空指针
perror(fopen);//这里我们提示一下报的错误
}
fclose(pf);//关闭文件并且把pf置为空指针
pf = NULL;
return 0;
}
这里我们就可以看到已经打开成功了。
三·文件一系列的读写函数介绍与使用:
下面我们就一一简单介绍一下这些有关文件的函数的应用:
1·fputc:
首先它是int fputc(int character,FILE*stream)我们来简单说说,它可以让我们输入东西,每当我们输入完东西,这个指针就会向后移动一个位置等待我们下次的输入 ;当我们输入到一定程度它就会返回EOF->-1;否则就会一直返回读取的字符。下面我们来演示一下:
int main() {
FILE* pf = fopen("test.txt", "w");
if (pf == NULL) {
perror(fopen);
return 1;
}
for (char i = 'a'; i <= 'z'; i++) {
fputc(i, pf);
}
fclose(pf);//关闭文件并且把pf置为空指针
pf = NULL;
return 0;
}
这样的话我们就成功写入了;接下来大家肯定好奇怎么打印出来;那么下面就是我们下面一个函数要介绍的功能了。
2·fgetc:
来看一下完整的:int fgetc(FILE*stream):这里我们可以看出来我们是输入的一个文件指针,然后它能通过这个指针一次次移动把我们的内容打印出,它返回的数据跟fputc一样所以我们来演示一下它:
int main() {
FILE* pf = fopen("test.txt", "r");
if (pf == NULL) {
perror(fopen);
return 1;
}
int ch = 0;
printf("%c", ch = fgetc(pf));
fclose(pf);//关闭文件并且把pf置为空指针
pf = NULL;
return 0;
}
这样我们就将第一个字符a打印出来,如果我们要是想打印整个文件的内容那要怎么办呢,当然这时我们就要利用它的返回值和循环了:
int main() {
FILE pf = fopen("test.txt", "r");
if (pf == NULL) {
perror(fopen);
return 1;
}
/for (char i = 'a'; i <= 'z'; i++) {
fputc(i, pf);
}/
int ch = 0;
/printf("%c", ch = fgetc(pf));*/
while ((ch = fgetc(pf)) != EOF) {
printf("%c", ch);
}
fclose(pf);//关闭文件并且把pf置为空指针
pf = NULL;
return 0;
}
这样的话我们就实现了;整个文件的所有内容也是如此的。
3·fputs:
int fputs(const char str,FILEstream);
下面还是展示代码:
int main() {
FILE* pf = fopen("test.txt", "w");
if (pf == NULL) {
perror(fopen);
return 1;
}
char str[20] = "i\nlove\nyou";
fputs(str, pf);
fclose(pf);//关闭文件并且把pf置为空指针
pf = NULL;
return 0;
}
这样的话我们就写文件完成了,当然我们也可以把str换成字符串效果也是一样的。
4·fgets:
charfgets(charstr,int num,FILE*stream)
简单的说就是这个函数,我们从参数后面开始往前理解,那么就是,从文件中选取num个字符放到这个str指针所指向的数组中。还是老样子代码展示:
char* str2[100] = { 0 };
fgets(str2, 3, pf);
printf("%s", str2);
如果我们要想像fputc那样都能换行的打印出来该怎麽做呢:没错,我们还可以根据它的返回类型是指针来把它全部找到:
char* str2[100] = { 0 };
while (fgets(str2, 3, pf) != NULL) {
printf("%s", str2);//这里我们每当打印完str2可认为它会自动清除,然后再一次while循环然后再次填入,当遇到文件末尾也就会返回空指针
}
这样的话我们也就把它全部打印出来了。
5·fprintf:
int fprintf(FILEstream,const format,...);这个函数类似我们输入的printf函数,只是加了一个文件指针;后面就是类似于我们printf里面的内容;接下来展示代码:
struct S {
char name[100];
int age;
float score;
}s = { .name = "lisi",.age = 12,.score = 99.9 };
int main() {
FILE* pf = fopen("test.txt", "w");
if (pf == NULL) {
perror(fopen);
return 1;
}
fprintf(pf, "%s %d %f", s.name, s.age, s.score);
fclose(pf);//关闭文件并且把pf置为空指针
pf = NULL;
return 0;
}
用这个函数我,们可以简单的输入文件内一些格式化数据使它储存起来。
6·fscanf:
int (FILEstream,const charformat,...):这个也类似于我们的日常的scanf,还是用代码说明下一吧。
struct S {
char name[100];
int age;
float score;
}/s = { .name = "lisi",.age = 12,.score = 99.9 };/
t = { 0 };
int main() {
FILE* pf = fopen("test.txt", "r");
if (pf == NULL) {
perror(fopen);
return 1;
}
fscanf(pf, "%s %d %f", t.name, &(t.age), &(t.score));
printf("%s %d %f", t.name, t.age, t.score);
fclose(pf);//关闭文件并且把pf置为空指针
pf = NULL;
return 0;
}//这里我们把刚才fprint格式化输入的内容读取得到并给结构体变量t内的成员,然后再把它打印出来
7·sprintf:
它的作用是是把所输入的信息数据放进对应的数组里并把它打印出来:
char str1[100] = { 0 };
sprintf(str1, "mynane");
printf("%s", str1);
这里我们就把它放入数组内并打印出来了。
8·sscanf:
这里它也类似于scanf函数,我们相当于在他前面加了一个指针,后面跟scanf用的一样,大概解释一下,我们是把前面指针所指的数据放到后面规定放的地方,下面代码展示:
char str1[100] = { 0 };
sprintf(str1, "mynane");
char str2[100] = { 0 };
sscanf(str1, "%s", str2);
printf("%s", str2);
这里联合引用了sprintf函数,最终成功打印出来。
9·fwrite:
这个是我们把数据按照二进制的形式写入文件内,那么它保存的也就是我们看不懂的二进制形式,下面代码展示:
FILE* pf = fopen("tset.txt", "wb");
if (pf == NULL) {
perror(fopen);
return 1;
}
int arr[10] = { 1,1,2,3,4,5 };
int sz = sizeof(arr) / sizeof(int);
fwrite(arr, sizeof(int), sz, pf);
fclose(pf);
pf = NULL;
return 0;
这样的话我们就成功写入进去了。
10·fread:
这个函数就是让我们把从文件中读取的数据放在数组内,然后需要我们把它自行打印出来,将存进去的二进制位转化成我们可以看懂的形式。该函数内部形式与fwrite相似,下面还是我们代码展示:
FILE* pf = fopen("tset.txt", "rb");
if (pf == NULL) {
perror(fopen);
return 1;
}
int arr1[10] = { 0 };
fread(arr1, sizeof(int), 4, pf);
for (int i = 0; i < 4; i++) {
printf("%d", arr1[i]);
}
fclose(pf);
pf = NULL;
它的结果如下:
这一部分简单介绍就到这里吧,希望对大家有一些帮助。
四·文件的随机读写函数等:
1·下面我们来介绍一下随机读写函数fseek:下面展示以下代码:
FILE pf = fopen("tset.txt", "r");
if (pf == NULL) {
perror(fopen);
return 1;
}
fseek(pf, 2, SEEK_SET);//这里我们会从起始指针位置开始向后偏移两个后在打印后面的一个字符
printf("%c", fgetc(pf));
fclose(pf);
pf = NULL;
return 0;
FILE pf = fopen("tset.txt", "r");
if (pf == NULL) {
perror(fopen);
return 1;
}
fseek(pf, 2, SEEK_SET);
fseek(pf, 2, SEEK_CUR);//这个和上一个配合使用相当于在上一个fseek执行完的后,在往后偏移两个再次打印;
printf("%c", fgetc(pf));
fclose(pf);
pf = NULL;
这里我们就成功打印出来了。
fseek(pf, -1, SEEK_END);
printf("%c", fgetc(pf));//这里我们四从后面开始向前偏移一个
下面我们展示一个恢复指针位置到起点的函数rewind:
fseek(pf, -3, SEEK_END);
printf("%c\n", fgetc(pf));
printf("%d\n", ftell(pf));//这里ftell函数会告诉我们偏移了多少
rewind(pf);
printf("%d", ftell(pf));
2·接下来我们介绍一下判断文件读写完成的标志:就是feof:我们要向这里面传递个指针如果文件正常读写结束,他就会返回一;但是还有可能在我们读写的中间出现了一些错误那么我们就需要用ferror提示一下,下面展示代码:
FILE* pf = fopen("tset.txt", "r");
if (pf == NULL) {
perror(fopen);
return 1;
}
int ch = 0;
while ((ch = fgetc(pf))!=EOF) {
printf("%c", ch);
}
printf("\n");
if (feof(pf)) {
printf("正常读取结束");
}
else if (ferror(pf)) {
printf("读取过程出现的问题");
}
fclose(pf);
pf = NULL;
这里他会正常读取完成:
权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/2401_82648291/article/details/137031878