当fgets在for循环之外时,为什么会得到以下输出:
吉姆,工程师
吉姆,工程师
吉姆,工程师
吉姆,工程师
,以及fgets在for循环内时的以下输出:
吉姆,工程师
帕姆,护士
麻烦,制造者
约翰·史密斯
int main()
{
int i;
char line[255];
FILE *fpointer = fopen("employees.txt", "r");
for (i=0; i < 4; i++){
fgets(line, 255, fpointer);
printf("%s", line);
}
fclose(fpointer);
return 0
}
在fget()中,“ i”没有作为参数传递,因此它如何仍遍历.txt文件中的每一行?
答案 0 :(得分:1)
fgets
将使用fpointer
(将其视为光标)读取文件,并将其递增。因此,每次使用fgets
时,文件中的内容都会向前移动。
答案 1 :(得分:0)
虽然您已经有了很好的答案,但是每次调用fgets()
(或任何其他输入函数)时,文件流都说明了文件位置指示器的运动,另一个不容忽视的必要点是,请始终检查输入函数的 返回,以确保使用读取的信息在调用之前成功。
在您的情况下,使用for
循环时,如果文件中少于4行,或者发生流错误,则将line
盲目传递给{{1} }而不知道它是否包含有效数据。这是未定义行为的邀请。始终检查退货。
读取数据时,通常需要使用读取功能本身来控制输入回路。在其他情况下,例如当请求特定的用户输入时,您希望连续循环直到提供所需的信息。在这两种情况下,您都将检查并使用输入函数的返回来确定循环是否继续。
要读取文件中的所有行(假设是您的输入),只需执行以下操作:
printf
如果您打算读取特定数量的行,则只需添加一个计数器即可,例如阅读4行:
#include <stdio.h>
#include <string.h>
int main()
{
char line[255];
FILE *fpointer = fopen("employees.txt", "r");
while (fgets(line, 255, fpointer)) { /* control read loop with fgets */
line[strcspn (line, "\r\n")] = 0; /* trim \n from end of line */
puts (line);
}
fclose(fpointer);
return 0;
}
这样,您就将int main()
{
size_t n = 0;
char line[255];
FILE *fpointer = fopen("employees.txt", "r");
/* control read loop with counter and fgets */
while (n < 4 && fgets(line, 255, fpointer)) {
line[strcspn (line, "\r\n")] = 0; /* trim \n from end of line */
puts (line);
n++;
}
fclose(fpointer);
return 0;
}
的返回值和行数纳入了循环条件中。
(注意::使用fgets()
返回字符串中字符集的数量,而不是排除集strcspn
的一部分,它提供了排除字符串的长度。行尾,您可以简单地用"\r\n"
或等价的数字'\0'
覆盖第一个行尾字符。实际上,它执行以下操作:)
0
如果您还有其他问题,请告诉我。