c - 如何跳过读取 fscanf 中的内容

标签 c

如果我有以下文本文件:

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

最佳答案

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

使用fgets()将整行读入一个适当大的缓冲区,让您有机会在解析中花时间来回,因为它只是内存中的字节到那时,您就不会再因为文件的当前位置随着您的阅读而增加而造成混淆。

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

整行内容更容易阅读,然后“用手”逐个标记地查看它。例如,strtok() 这通常有点危险,但在这里应该没问题。

关于c - 如何跳过读取 fscanf 中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16584491/

相关文章:

C: exec到我自己的exe文件

c - 使用 SDL2 库对 C 中的 2 个播放器进行键盘检测的问题

c++ - 引用 const char* 数组

c - 函数中的空指针

c - 将 malloc 字符串索引初始化为 NULL

c - 为什么数组和指针属于二级常量?

c++ - C/C++ 自动完成中的 Eclipse 和 GTK+ 3.0 开发

C++ 和 WINSOCK - 接收两个结构和两个消息

c - C 中的滚动菜单

c - Scanf 更多值 C