【问题标题】:Read Multiple Integers From line - C从行中读取多个整数 - C
【发布时间】:2015-11-15 18:53:33
【问题描述】:

我正在尝试从一个 500Mb 文本文件中读取多个整数,其中整数是 int 格式

1000002 1 55
1000002 1000006 33
1000002 1000007 8
1000002 1000009 144

当我尝试读取整数时,我遇到的问题是程序没有读取足够的整个文件以及它读取的那个文件,它似乎不是我的代码的正确值

FILE *file;
    file = fopen("user_artist_data.txt", "r");
    int User_ID, artist_ID, Play_Count = 0;
    int check = 0;
    while(fscanf(file, "%d %d %d", &User_ID, &artist_ID, &Play_Count) != 0)
    {
        check++;
        printf("%d %d %d\n", User_ID, artist_ID, Play_Count);
    }
    fclose(file);

你能帮我修复我的代码吗? 谢谢

【问题讨论】:

  • 首先尝试检查读取时是否有错误,并在退出循环之后和关闭file 之前查看errno 值及其与strerror(errno) 的文本表示。
  • 你在 TurboC 中使用 16 位整数编程吗?
  • 我在 OS X 上使用 GCC
  • 那么有些事情你没有告诉我们。您能否将输入文件发布到文件共享站点,以便我们验证实际格式和内容?使用 bzip2 或 gzip 压缩它会大大减小大小。

标签: c file scanf


【解决方案1】:

仔细阅读fscanf(3) 的文档(您可能应该多读一遍)。

然后你就会明白你可能应该编码

while(fscanf(file, " %d %d %d", &User_ID, &artist_ID, &Play_Count) == 3)

(请注意,fscanf 会像换行一样处理空格)

顺便说一句,如果您的文件是面向行的,您最好阅读每一行,例如getline(3)(或者fgets,如果getline不可用)然后用sscanf(3)解析每一行。 %n 转换规范可能非常有用。

不要忘记使用所有警告和调试信息进行编译(例如 gcc -Wall -Wextra -g,如果使用 GCC...)并使用您的调试器(例如 gdb

【讨论】:

  • 好吧,他也可以使用格式并将fscanf%d %d %d\n 放在一起。
  • 不,\nfscanf 的空格相同
  • 我更改了我的代码,但是当我运行它时,fscanf 实际上返回 3,所以循环没有运行,是否有这样做的原因。我现在要试试getline
  • 您可能不希望格式字符串中有任何空格,因为%d 会自动跳过空格。
  • @milevyo:空行将被fscanf 忽略,格式为%d,就像任何其他空白一样。输入文件中的任何非数字数据都会导致 fscanf 停止解析,第一次返回不完整的计数,随后每次返回零计数,如果您只是测试 != EOF,则永远循环。
猜你喜欢
  • 2014-04-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多