[C中的getline()创建无限循环并跳过第一个单词?

问题描述 投票:1回答:1

我是C语言的初学者,我正在尝试创建一个简单的待办事项列表程序。我正在尝试在while循环中使用getline,正如我在另一个堆栈溢出答案中看到的那样,我以为我理解了,但这只是创建了一个无限循环。同样,由于某种原因,它似乎跳过了第一个单词。到目前为止,这是我的代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

FILE *list;
int i = 0;
int item = 0;
char items[10];
char chars[1000];
char * line = NULL;
size_t len = 0;
ssize_t read;

int main() {
  list = fopen("/Users/bendavies/Documents/C/list.txt", "r");
  int letterCount = fscanf(list,"%s",chars);

  printf("Welcome to the to-do list. It can hold up to 10 items.\n");

  printf("%d\n", letterCount);

  if (letterCount == -1) {
    printf("The list currently has no items!\n");
  } else {
      while ((read = getline(&line, &len, list)) != 1) {
        item += 1;
        printf("%d. %s", item, line);
      }
    }
    fclose(list);

  return 0;
}

我目前通过以下list.txt获得的输出:

Eat food
Drink water
Breath air

是:

1.  food
2. Drink water
3. Breath air
4. 18446744073709551615
5. 18446744073709551615

依此类推。

谢谢你! :)

c getline
1个回答
3
投票

但是它只是在创建一个无限循环。

您的代码的这一行:while ((read = getline(&line, &len, list)) != 1)

除非一行包含1字符(只是换行符),否则它将是一个无限循环。完全读取文件后,POSIX getline()函数将返回getline()(不是-1,即使EOF is通常为-1)。因此,将该行更改为:

EOF

但是,我看不到您在该循环内使用while ((read = getline(&line, &len, list)) != -1) 的值,所以这样做会更好:

  • 修复1: read

在该循环中,我看到:while (getline(&line, &len, list) != -1)

[您可能会发现printf("%d. %s", item, line);的非常旧的实现,其中不包括换行符,在这种情况下,如果您希望将输出放在单独的行中,则需要放置getline()

  • 修复2 :: >> getline()
  • 但是,如果使用更现代的实现,它将根据POSIX规范保留换行符。

此外,如果文件中的最后一个“行”未以换行符终止,您可能仍要添加一个。在这种情况下,您可以保留读取的长度,并使用该长度来检测行尾是否有换行符。

由于某种原因,它似乎也跳过了第一个单词

由于\n

printf("%d. %s\n", item, line);读取文件的第一个单词。现在,文件指针位于该位置(第一个单词的结尾),并且将从该位置进一步读取文件。

因此,从文件中读取第一个单词后,将文件指针重新定位到文件的开头:

  • 修复3:

    int letterCount = fscanf(list,"%s",chars);
© www.soinside.com 2019 - 2024. All rights reserved.