linux下的文件操作2

linux下的文件操作2

之前讲了系统调用和库函数在文件操作方面的联系和区别,并以打开文件举了几个例子。打开文件后当然不是为了关闭文件,而是为了读取或者写入文件,所以现在整理一下文件的读写。

系统调用提供的文件读写函数有:read, write 等,但是我们不用它们,麻烦,一般都使用库函数提供的文件读写函数(这里是C的库函数,其他的不熟)。

先讲读取文件。库函数提供的文件读取函数大致能分三个种类:一次读取一个字符的;一次读取一行的;格式化读取的。

一次读取一个字符的函数有:

int fgetc(FILE *stream);int getc(FILE *stream);int getchar();

fgetc从文件流中读取一个字符,读取类型为unsigned char,然后fgetc内部将unsigned char转换成int返回,如果读取错误或者已经到达文件尾,返回EOF,EOF是个宏定义,值是-1,使用时最好用EOF,一来可读性好,二来直接用-1哪天宏改了就死的难看了。其实这里定义宏就是为了避免在文件中使用常数,好处大大的。

getc用法和fgetc一样,但是是优化过的fgetc版本,所以使用这个函数可以提高点效率,但是getc可能定义为一个宏,所以把函数名当作函数指针使用的时候,这个不能保证正确性,最好用fgetc。

getchar()相当于fgetc(stdin),从标准输入中读取一个字符。

一次读取一行的函数有:

char *fgets(char *s, int count, FILE* stream);char *gets(char *s);

fgets从文件流中读入字符,遇到三种情况停止:读到行尾字符(\n);读到文件尾EOF;已经读入了count-1个字符。然后fgets会在读入的字符末尾加上字符串的结尾符号(零字符,’\0’,null character,不知道怎么翻译好),所以在第三种情况下刚好会有count个字符写入s指向的字符数组中。函数成功后返回传入的字符指针s,失败的话会返回空指针。

gets从标准输入(stdin)中读入任意多个字符,知道换行或者文件尾,相当于fgets(s, MAX, stdin), 其中MAX不知道多大,所以你事前也不知道分配多少空间好,很容易造成溢出,所以这个函数最好别用。

格式化读取的函数留给以后写了,比较多。

讲完读取然后就是写入了,和读取刚好相反的过程,使用的函数也很类似,下面列出函数声明。一次写入一个字符的函数:

int fputc(int c, FILE *stream);int putc(int c, FILE *stream);int putchar(int c);

fputc将字符c写入文件流中。putc是优化了的fputc版本,可能是宏。putchar(c)相当于fputc(c, stdout)。一次写入一行的函数:

int fputs(const char *s, FILE *stream);int puts(const char *s);

fputs将字符指针s所指字符数组中的字符输出到文件流中,不输出零字符(‘\0’)。puts将字符数组中的字符输出到标准输出(stdout),然后输出一个换行符。例如:

char str[] = "hello";puts(str);

输出hello\n,后面的换行符是puts加上去的。fputs不会加。我试了一下,如果字符数组最后有换行符,那么这个函数就不加换行了。我用的是GNU的C库,不知道其他版本的C库怎么处理的。格式化输出也以后写了将会错过更好的风景,保持一份平和,保持一份清醒。

linux下的文件操作2

相关文章:

你感兴趣的文章:

标签云: