如果我有以下文本文件:
1 2 3 4 5 6 7 8 9 10 YEAH
11 12 13 14 15 16 17 18 19 20 YEAH
我必须遵循以下代码:
#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);
}
...当文本文件只有数字时它完全正常但是当我在文本文件中添加字符“Yeah”时,代码变得疯狂。我如何包含它们?请解释一下,因为我对此仍然很新。我会用fscanf(foo,%d%* c,&amp; temp); ???如果有一个新的行语句,我将如何处理?
非常感谢
编辑: 我最初提供的电子输入是
1 2 3 4 5 6 7 8 9 10
11 12 13 14 15 16 17 18 19 20.
这里所有内容都正确打印出来。当在10之后将文字文件添加到文本文件时,所有其他数字也是10。基本上它不包含11 12到20并且打印出来:1 2 3 4 5 6 7 8 9 10 10 10 10 10 10 10 10 10 10 10
答案 0 :(得分:1)
一次处理这样一行的数据总是比较简单,而不是一次直接处理一个“令牌”。
用fgets()
整行读入一个适当大的缓冲区,让你有机会花时间在解析中来回走动,因为在那一点上它只是内存中的字节而你没有由于文件具有当前位置而导致的风险混淆较长,该位置在您阅读时递增。
你的示例转换不起作用,因为你需要类似“n个数字后跟不是数字的东西,然后是行尾”的东西,我不认为它可以表示为单个简单的{{1}转换字符串。
在整行中更容易阅读,然后通过令牌“手动”查看令牌。例如,请参见fscanf()
,这在一般情况下是危险的,但在这里应该没问题。
答案 1 :(得分: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;