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库怎么处理的。

格式化输出也以后写了


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值