一、逐个字符读文件
1.源代码
#include <stdio.h> int main() { FILE * fp; int i; char * path="./test.txt"; int ch; fp = fopen(path, "r"); if(fp == NULL) { perror("open error"); return 1; } printf("output data in test.txt\n"); for(i=0; i<5;i++) { ch = fgetc(fp); if(ch == EOF) { perror("fgetc error"); return 1; } else { printf("%c", (char)ch); } } printf("\nget suceesful\n"); fclose(fp); return 1; }
test.txt文件内容
hi,io
输出内容为
output data in test.txt hi,io get suceesful
2.解释
fgetc函数声明为
int fgetc(FILE * stream);
参数stream为FILE结构体的指针,用于指向一个文件,使得该函数从指定的文件中读取一个字节。如果此函数调用成功,则返回读到的字节;如果出错,则返回EOF。EOF在stdio.h中定义的值为-1。
函数fgetc()调用成功后,返回的是读到的字节,应该为unsigned char 类型,但fget()函数原型中返回值类型是int。原因在于函数调用出错或读到文件末尾是会返回EOF,即-1。在int型的返回值是0xffffffff。如果读到字节oxff,则unsigned char型转换为int型是0x000000ff(即255),只有规定返回值是int型才能把这两种情况区分开。如果规定返回值是unsigned char型,那么当返回值是0xff时则无法区分到底是EOR还是字节oxff。(因为char
c=255; int t=(int)c; t为-1)。【1】
二、逐个字符写文件
1.源代码
#include <stdio.h> int main() { FILE * fp; int i; char * path="./testout.txt"; fp = fopen(path, "w"); if(fp == NULL) { perror("open error"); return 1; } char arr[5]={'l','i','n','u','x'}; for(i=0; i<5;i++) { if(fputc(arr[i],fp) == EOF) { perror("fgetc error"); return 1; } } printf("\nputc suceesful\n"); fclose(fp); return 1; }
在当前上当下新建文件testout.txt。运行此程序后,文件内容为
linux
2.解释
fputc函数声明为
int fputc(int c, FILE * stream);
注意
刚开始学习linux c,为避免麻烦,最好登录用户为root。
参考文献
【1】《linux c从入门到精通》