目录
一、fgets与fputs——文本行输入出函数
假设已经有文件test.txt,里面存放着bit hello两行字符
fgets:char* fgets(char* string, int n, FILE* stream) string是数据存储的位置,从文件(stream)中读取的信息放到string这个字符数组中,n表示最多读取多少个字符。
int main()
{
char buf[1024] = { 0 };
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
return 0;
}
//读文件
fgets(buf, 1024, pf);
printf("%s\n", buf);
fclose(pf);
pf = NULL;
return 0;
}
打印buf也可以不加\n,因为如果文件里有\n,那么也会被读取,所以会换行,如果没有,就不换行。
或者输出的话还可以看一个puts函数,int puts(const char* string),写一个字符串到stdout去。所以
fgets(buf, 1024, pf);
puts(buf);
puts函数会不管怎样,都会自动换行。
如果以“w”形式写,需要用到fputs函数 int fputs(const char* string, FILE* stream)
int main()
{
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
return 0;
}
//写文件
fputs("hello", pf);
fputs("world", pf);
fclose(pf);
pf = NULL;
return 0;
}
无论原先文件存不存在,内容都有什么,都会创建一个文件,写入内容,并覆盖旧的。这里没写换行,所以打印出来也不换行。
两个函数也可以操作屏幕、键盘
int main()
{
char buf[1024] = { 0 };
fgets(buf, 1024, stdin);//从标准输入流读取,也就是键盘
fputs(buf, stdout);//输出到标准输出流,屏幕
return 0;
}
或者直接使用gets和puts
gets(buf);
puts(buf);
这两个默认就是从标准输入到标准输出。
二、fscanf与fprintf——格式化输入出函数
int fprintf (FILE* stream, const char* format[argument])可针对stdout也可以针对指定的流
printf (const char* format[argument])针对stdout
struct S
{
int n;
float score;
char arr[10];
};
int main()
{
struct S s = { 100, 3.14f, "bit" };
FILE* pf = fopen("test.txt", "w");
if (pf == NULL)
{
return 0;
}
//格式化的形式写文件
fprintf(pf, "%d %f %s", s.n, s.score, s.arr);
fclose(pf);
pf = NULL;
return 0;
}
可以按照不同的格式来操作,那么反过来,向文件输入
int scanf (const char* format[argument]);
int fscanf(FILE* stream, const char* format[argument]);
所以和上面的一样,接下来是代码
struct S
{
int n;
float score;
char arr[10];
};
int main()
{
struct S s = { 0 };
FILE* pf = fopen("test.txt", "r");
if (pf == NULL)
{
return 0;
}
//格式化的形式输入文件
fscanf(pf, "%d %f %s", &(s.n), &(s.score), s.arr);
printf("%d %f %s\n", s.n, s.score, s.arr);
fclose(pf);
pf = NULL;
return 0;
}
同样也可以适用于标准输入和标准输出
int main()
{
struct S s = { 0 };
fscanf(stdin, "%d %f %s", &(s.n), &(s.score), s.arr);
fprintf(stdout, "%d %f %s\n", s.n, s.score, s.arr);
return 0;
}
三、sscanf与sprintf——字符串输入出函数
对比函数
scanf/fscanf/sscanf
printf/fprintf/sprintf
scanf/printf:是针对标准输入流/标准输出流的格式化输入/输出语句
fscanf/fprintf: 是针对所有输入流/所有输出流的格式化输入/输出语句
sscanf/sprintf
sscanf:int sscanf(const char* buffer, const char* format[,argument]...); 从一个字符串里读取格式化的数据
sprintf: int sprintf(const char* buffer, const char* format[,argument]...); 往一个字符串里写一个格式化的数据
一个读字符串,一个写到字符串去
看代码
struct S
{
int n;
float score;
char arr[10];
};
int main()
{
struct S s = { 100, 3.14f, "abcdef" };
struct S tmp = { 0 };
char buf[1024] = { 0 };
sprintf(buf, "%d %f %s", s.n, s.score, s.arr);
sscanf(buf, "%d %f %s", &(tmp.n), &(tmp.score), tmp.arr);
printf("%d %f %s\n", tmp.n, tmp.score, tmp.arr);
return 0;
}
我们可以s这个结构体变量中的数据放到buf数组里,也可以把buf数组里的内容读取出来放到tmp中。
sscanf/sprintf:sscanf是从字符串中读取格式化的数据,sprintf是把格式化数据输出或(存储到)字符串
结束。