2

如果我有以下文本文件:

1 2 3 4 5 6 7 8 9 10 是的

11 12 13 14 15 16 17 18 19 20 是的

我必须遵循代码:

  #include <stdio.h>

int main(){
int arr[5][10];

FILE* foo; 
foo = fopen("help.txt", "r");

int i, j;
int temp; 

while (i<5 && (fscanf(foo, "%d", &temp)) !=EOF ){   
    arr[i][0]= temp;

    for (j=1; j<10; j++){

        fscanf(foo, "%d", &temp);
            arr[i][j]=temp;

    }
    i++;
}


for (i=0; i<2; i++){
    for (j=0; j<10; j++)
        printf("%d ", arr[i][j]);
    printf("\n");
}
fclose(foo);
}

...当文本文件只有数字时它工作得非常好,但是当我将字符“是”添加到文本文件时,代码变得疯狂。我如何包括它们?请简单解释一下,因为我对此还很陌生。我会使用 fscanf(foo, %d%*c, &temp);??? 另外,如果有新行语句,我将如何处理?

非常感谢

编辑:我最初提供的 e 输入是

1 2 3 4 5 6 7 8 9 10

11 12 13 14 15 16 17 18 19 20。

在这里,一切都正确打印出来。在 10 之后将单词 yes 添加到文本文件时,所有其他数字也是 10。本质上它不包含 11 12... 到 20。并打印出:1 2 3 4 5 6 7 8 9 10 10 10 10 10 10 10 10 10 10 10

4

2 回答 2

1

一次处理一行这样的数据总是比直接针对文件一次处理一个“令牌”更容易。

将整行读取fgets()到一个适当大的缓冲区中,让您有机会花时间在解析中来回进行,因为此时它只是内存中的字节,并且您不再因文件而冒着混淆的风险当前位置在您阅读时递增。

您的示例转换不起作用,因为您需要类似“n 个数字后跟不是数字的数字,然后是行尾”之类的东西,我认为这不能表示为单个简单的fscanf()转换字符串。

整行更容易阅读,然后“手动”逐个查看。看,例如strtok(),这一般来说有点危险,但在这里应该没问题。

于 2013-05-16T10:08:14.330 回答
1

尝试这个:

int e;
while (i<5 && (e = fscanf(foo, "%d", &temp)) !=EOF ){
    if(e==0) {
        fscanf(foo, "%*[^0-9]"); // this will skip the non numeric chars
        continue;
    }
    arr[i][0]= temp;

for (j=1; j<10; j++){
    e = fscanf(foo, "%d", &temp);
    if (e==EOF) break;
    else if (e==0) {
        fscanf(foo, "%*[^0-9]"); continue;
    }
    arr[i][j]=temp;
于 2013-05-16T10:15:42.367 回答