7.7 行输入和行输出
标准库提供了一个输入函数 fgets
,它和前面几章中用到的函数 getline
类似
char *fgets(char *line, int maxline, FILE *fp)
fgets
函数从 fp
指向的文件中读取下一个输入行(包括换行符)
并将它存放在字符数组 line
中,它最多可读取 maxline - 1
个字符
读取的行将以 '\0'
结尾保存到数组中
通常情况下,fgets
返回 line
,但如果遇到了文件结尾或发生了错误,则返回 NULL
我们编写的 getline
函数返回行的长度,这个值更有用,当它为 0
时意味着已经到达了文件的结尾
输出函数 fputs
将一个字符串(不需要包含换行符)写入到一个文件中:
int fputs(char *line, FILE *fp)
如果发生错误,该函数将返回 EOF
,否则返回一个非负值
库函数 gets
和 puts
的功能与 fgets
和 fputs
函数类似,但它们是对 stdin
和 stdout
进行操作
有一点我们需要注意,gets
函数在读取字符串时将删除结尾的换行符('\n'
), 而 puts
函数在写入字符串时将在结尾添加一个换行符
下面的代码是标准库中 fgets
和 fputs
函数的代码:
/* fgets: get at most n chars from iop */
char *fgets(char *s, int n, FILE *iop)
{
register int c;
register char *cs;
cs = s;
while (--n > 0 && (c = getc(iop)) != EOF)
if ((*cs++ = c) == '\n')
break;
*cs = '\0';
return (c == EOF && cs == s) ? NULL : s;
}
/* fputs: put string s on file iop */
int fputs(char *s, FILE *iop)
{
int c;
while (c = *s++)
putc(c, iop);
return ferror(iop) ? EOF : 0;
}
ANSI 标准规定,ferror
在发生错误时返回非 0
值,而 fputs
在发生错误时返回 EOF
,其它情况返回一个非负值
使用 fgets
函数很容易实现 getline
函数:
/* getline: read a line, return length */
int getline(char *line, int max)
{
if (fgets(line, max, stdin) == NULL)
return 0;
else
return strlen(line);
}