while循环文本文件意外停止

时间:2015-05-18 18:07:34

标签: c file while-loop integer scanf

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

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

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

目前我的代码有一个while循环,它遍历文件并获取所有小数值。然而,由于一些未知的原因,它在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;

3 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

-在找到与其图案匹配的内容之前不会继续查看其输入。在这种情况下,它遇到单独的# sample message shown in the celery docs {"id": "4cc7438e-afd4-4f8f-a2f3-f46567e7ca77", "task": "celery.task.PingTask", "args": [], "kwargs": {}, "retries": 0, "eta": "2009-11-17T12:30:56.527191"} ,并且无法将其解析为整数,返回零。这打破了你的循环。你需要使用EOF来打破你的循环。

答案 2 :(得分:0)

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

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