字符串读(fgets)
描述
C 库函数 char *fgets(char *str, int n, FILE *stream) 从指定的流 stream 读取一行,并把它存储在 str 所指向的字符串内。当读取 (n-1) 个字符时,或者读取到换行符时,或者到达文件末尾时,它会停止,具体视情况而定。
声明
下面是 fgets() 函数的声明。
char *fgets(char *str, int n, FILE *stream)
参数
- str -- 这是指向一个字符数组的指针,该数组存储了要读取的字符串。
- n -- 这是要读取的最大字符数(包括最后的空字符)。通常是使用以 str 传递的数组长度。
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要从中读取字符的流。
返回值
如果成功,该函数返回相同的 str 参数。如果到达文件末尾或者没有读取到任何字符,str 的内容保持不变,并返回一个空指针。
如果发生错误,返回一个空指针。
int main() { char buf[1024] = { 0 }; FILE* pf = fopen("test.txt", "r"); if (pf == NULL) { return 0; } fgets(buf, 1024, pf); printf("%s", buf); fclose(pf); pf = NULL; return 0; }
字符串写(fputs)
描述
C 库函数 int fputs(const char *str, FILE *stream) 把字符串写入到指定的流 stream 中,但不包括空字符。
声明
下面是 fputs() 函数的声明。
int fputs(const char *str, FILE *stream)
参数
- str -- 这是一个数组,包含了要写入的以空字符终止的字符序列。
- stream -- 这是指向 FILE 对象的指针,该 FILE 对象标识了要被写入字符串的流。
返回值
该函数返回一个非负值,如果发生错误则返回 EOF。
int main() { char buf[1024] = { 0 }; FILE* pf = fopen("test.txt", "w"); if (pf == NULL) { return 0; } fputs("hellow", pf); fgets(buf, 1024, pf); pf = NULL; return 0; }
int main() { char buf[1024] = { 0 }; FILE* pf = fopen("test.txt", "w"); fgets(buf, 1024, stdin);//从标准输入流读取 fputs(buf, stdout);//输出到标准输出流 return 0; }
上面代码可以等价于
int main() { char buf[1024] = { 0 }; FILE* pf = fopen("test.txt", "w"); gets(buf); puts(buf); return 0; }
格式化写(fprintf)
int main() { int a = 111; FILE* pf = fopen("test.txt", "w"); fprintf(pf, "%d", a); return 0; }
注释:把a写到文件里面
格式化读(fscanf)
struct S { int n; float score; char arr[10]; }; int main() { struct S s = { 0 }; FILE* pf = fopen("test.txt", "w"); fscanf(pf, "%d %f %s", &(s.n), &(s.score), s.arr); return 0; }
注释:把信息从文件里面读到结构体里面
比较
scanf( "%d %f %s", &(s.n), &(s.score), s.arr); //相当于 fscanf(stdin, "%d %f %s", &(s.n), &(s.score), s.arr); fprintf(stdout, "%d %f %s", s.n, s.score, s.arr); //相当于 printf( "%d %f %s", s.n, s.score, s.arr);
sprintf和sscanf
sprintf
int main() { struct S s = { 100,3.14,"abcdef"}; char buf[1024] = { 0 }; sprintf(buf, "%d %f %s", s.n, s.score, s.arr); return 0; }
把结构体内容写到字符数组里面去。
sscanf
int main() { struct S s = { 100,3.14,"abcdef"}; struct S temp = { 0 }; char buf[1024] = { 0 }; sprintf(buf, "%d %f %s", s.n, s.score, s.arr); sscanf(buf, "%d %f %s", &(temp.n), &(temp.score), temp.arr); return 0; }
把字符数组里面的内容读到结构体里面去。