【C语言】文件操作scanf,fscanf,sscanf(第二弹)
上次【C语言】文件操作超细的!(第一弹)_tt142的博客-CSDN博客
已经简单的介绍了文件的相关知识,下面具体来讲一下函数
目录
1.printf,fprintf,sprintf
2.scanf,fscanf,sscanf
1.printf,fprintf,sprintf
printf是我们很熟悉的函数,他是把数据打印到屏幕上,针对的是标准输出流
fprintf,针对文件,对于所有输出流都适用,把数据格式化之后输出到文件里
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
int main()
{
FILE* p = fopen("text.txt", "r");
if (p == NULL)
{
return 1;
}
int ch=fgetc(p);
if (ch!= EOF)
{
//putchar(ch);
printf("%c\n", ch);
}
fclose(p);
p = NULL;
return 0;
}
int main()
{
int a = 2;
printf("%d\n", a);
FILE*p=fopen("text.txt", "w");
if (p == NULL)
{
return 1;
}
char arr[] = "abc";
if (1==fprintf(p, "%s", arr))
{
printf("success\n");
}
else
{
if (feof(p))
{
printf("end\n");
}
else if(ferror(p))
{
printf("in\n");
}
}
fclose(p);
p = NULL;
return 0;
}
我们会看到
注意在写fprintf的时候,这个函数是有返回值的
如果成功写入,会返回写入的总数量,我们这里写进了一个字符串
补充:
在判断返回值是否为1的时候,我们写了函数feof
注意:feof不能直接判断是否到文件末,而是当文件结束的时候到底是因为文件末还是异常结束!
所以对于fgetc这样的读取失败返回文件末的函数,应该用feof判断一下返回值是否为EOF
int main() { FILE* p = fopen("text.txt", "r"); if (p == NULL) { return 1; } int ch=fgetc(p); if (ch!= EOF) { //putchar(ch); printf("%c\n", ch); } fclose(p); p = NULL; return 0; }
而fgets
如果遇到文件末尾,会返回EOF,此时应该用feof判断
如果在一开始就读到end-of-file,后面还有可读的字符,那文件指针会被置空,并且没读到的字符不会被改变(显然),如果读取过程中就遇到了错误,那么用ferror(专门判断在读取过程中遇到错误的函数),文件指针依旧会被置空,但是此时这个指针指到的字符就会被改变!!
我们知道,文件指针起始指向第一个字符,每读取一次就会自动后移一个位置
sprintf,针对字符串,也只适用于字符串,把数据格式化之后输出到字符串里
int main()
{
FILE* p = fopen("text.txt", "w");
if (p == NULL)
{
return 1;
}
fprintf(p, "%s", "abc");
fclose(p);
p = NULL;
p = fopen("text.txt", "r");
char ans[5];
sprintf(ans,"%c%c",fgetc(p), fgetc(p));
fclose(p);
p = NULL;
return 0;
}
2.scanf,fscanf,sscanf
和上三个函数差不多
scanf,键盘的数据输入到键盘缓冲区,函数从缓冲区拿数据
fsacnf,从文件缓冲区中拿数据,格式化,输入到指定类型的变量中
sscanf,从字符串中拿数据,格式化,输入到指定类型的变量
int main()
{
FILE* p = fopen("text.txt", "r");
if (p == NULL)
{
return 1;
}
char ch[6]={0};
fscanf(p, "%c", &ch[0]);
printf("%c", ch[0]);
char arr[6]={0};
sscanf(&ch[0], "%c", &arr[0]);
printf("%c\n", arr[0]);
fclose(p);
p = NULL;
return 0;
}
文件缓冲区
我们前面说的fscanf和fprintf不是直接从文件里读数据到变量,或者写入文件,而是所谓缓冲文件系统是指系统自动地在内存中为程序中每一个正在使用的文件开辟一块“文件缓冲区”。
从内存向磁盘输出数据会先送到内存中的缓冲区,装满缓冲区后才一起送到磁盘上。
如果从磁盘向计算机读入数据,则从磁盘文件中读取数据输入到内存缓冲区(充满缓冲区),然后再从缓冲区逐个地将数据送到程序数据区(程序变量等)。
缓冲区的大小根据C编译系统决定的。