与C中的for循环有关的fgets()问题

时间:2019-05-29 02:42:30

标签: c

当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文件中的每一行?

2 个答案:

答案 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

如果您还有其他问题,请告诉我。