【问题标题】:While loop through text file stops unexpectedly虽然循环文本文件意外停止
【发布时间】:2015-05-18 18:07:34
【问题描述】:

我正在尝试遍历包含随机内容的文本文件。目前的内容是:

"13 -35 57 - 23723724 
12taste-34the+56rain-bow845"

我的程序应该只从文件中获取数字(-35 作为负数,但不是 - 23723724,因为它们之间有空格)并且没有字母或与整数无关的其他字符。

目前我的代码有一个循环遍历文件并获取所有十进制值。然而,由于某些未知原因,它在 57 之后停止(总结果为:“13-3557”,然后停止)。

我曾尝试单独遍历每个字符,但这带来了它自己的一系列问题,而且此方法至少返回整数。

这是我的代码:

int *getIntegers(char *filename, int *pn) {
    // Create a dynamic array
    int len = 100;
    int *numbers = malloc(sizeof(int) * len);

    // Source file
    FILE *file;
    file = fopen(filename, "r");

    int i = 0, number = 0;
    while(fscanf(file, "%d", &number) > 0) {
        numbers[i++] = number;
        printf("%d", number);
    }

    return numbers;
}

编辑: 我已经更改了我的代码,它现在检索所有数字,但没有空格。

// Create a dynamic array
int len = 100;
int *numbers = malloc(sizeof(int) * len);

// Source file
FILE *file;
file = fopen(filename, "r");

int i = 0, number = 0;
while(!feof(file)) {
    if(fscanf(file, "%d ", &number) > 0) {
        numbers[i++] = number;
    } else {
        clearerr(file);
        fgetc(file);
    }
}

fclose(file);
return numbers;

【问题讨论】:

  • 你有什么问题?
  • @RSahu 为什么它停在 57 而不是继续获取​​其余的数字。
  • 你期望的输出是什么?
  • @BLUEPIXY 文本文件中的数字,以空格分隔。现在我得到了所有的数字,但没有得到分隔空间。我会更新我的代码。

标签: c file while-loop integer scanf


【解决方案1】:

当输入流遇到- 并且它希望看到一个整数时,它不会读取任何内容。它停在那里。

如果您想继续阅读其余数字,则需要一些代码来读取下一个字符,将其丢弃并继续。

while(!foeof(file) )
{
    if ( fscanf(file, "%d", &number) > 0) {
       numbers[i++] = number;
       printf("%d", number);
    else {
       clearerr(file); // Clear the error state.
       fgetc(file);    // Read the next character and discard it.
    }
}

更新

要在输出中的数字之间添加空格,请使用:

       printf("%d ", number);

【讨论】:

  • 您的解决方案有效,但数字没有用空格分隔。我尝试简单地添加numbers[i++] = ' ',但这只是改变了数字并且没有添加空格。
  • 您可以在数字之间打印一个空格。
  • 令人惊讶的是,我认为我无法做到这一点,因为我的主要功能(它传递数据)在打印值后没有包含空格。但是再次检查它实际上确实有一个空格,所以在返回数据之前我不会有添加空格。谢谢,我会尽快将您的答案标记为已接受。
【解决方案2】:

fscanf 不会一直查看其输入,直到找到与其模式匹配的内容。在这种情况下,它遇到了唯一的-,并且无法将其解析为整数,因此返回零。这打破了你的循环。您将需要使用 EOF 来中断循环。

【讨论】:

  • 好的,我已经改了。现在它返回给我更多的数字,其中大部分是 12(总共 551 个字符),这比我的文件中的要多得多。
  • 您正在为fscanf 遇到的每个非十进制输出number 的内容。存储fscanf的返回值,如果返回值不为零,则只输出number
【解决方案3】:

这是因为fscanf 看到了孤独的'-',因为这不是一个有效的数字,它无法解析它并返回0,这会导致你的循环结束。

我建议您使用fgets 读取整行,然后使用strtok 分隔空格,并使用strtol 将标记化的字符串转换为数字。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-16
    • 1970-01-01
    • 2014-06-06
    • 2018-09-07
    • 2012-06-09
    相关资源
    最近更新 更多