从txt文件中读取并输入到C语言数组

3

我有一个txt文件

4  
110  
220  
112  
335 

4是行数,4*3是整数的数量。我需要先读取“4”,然后读取剩余部分并将它们输入到一个数组中。

这是我的代码:

void main(){ 
    int a,n;    
    int i=0,j=0,k[30]; //
    int *N;

    FILE *fp = fopen("test.txt", "r");  
    if(fscanf(fp, "%d", &a) != 1) { //
       // something's wrong 
    }

    n=3*a; //3*a numbers in the file
    N = malloc(3 * a * sizeof(int)); 
    for(i = 0; i <n;++i) {
       int result=fscanf(fp, "%d", &N[i] );  
    }   
    fclose(fp);  
    for(j=0;j<3*a;j++){  
       k[j]=N[j]; 
    }

    printf("%d",k[0]);
 }

当我打印k[0]时,应该打印“1”,但实际上整行“110”被打印了。

还有其他的方法吗?


1
你正在尝试将四个“数字”读取为十二个“数字位数”。你的代码将读取4个“整数”值,然后在剩余的8次读取中失败。 - WhozCraig
注意:+1,你正在测试fscanf(fp, "%d", &a)的结果,应该也测试result - chux - Reinstate Monica
3个回答

3

格式说明符%d没有指定长度,因此fscanf将尽可能读取多个数字;这就是为什么你得到的是110而不是只有1。

如果您指定一个长度,比如%1d,它只会读取您告诉它的那么多个数字:

for(i = 0; i <n;++i) {
   int result=fscanf(fp, "%1d", &N[i] );  
}   

由于某种原因,当我打印N [0],N [1]和N [2]时它可以工作,但是当我尝试打印N [3]时,输出结果是596567954789654。 - user3075022
test.txt里有什么?听起来在 110220 之间有一些非数字的东西。 - Joni
我觉得我的电脑或编译器出了问题???我在一个在线编译器上尝试了一下,它可以工作。非常感谢! - user3075022

2
fscanf(fp, "%d", &N[i] )将捕获一个数字而不是一个数字字符。因此,
fscanf(fp, "%d", &N[0] )  //will catch 110
fscanf(fp, "%d", &N[1] )  //will catch 220
...

如果您想从数组中获取数字,可以使用以下代码:

for(i = 0; i <n;++i) {
    int result=fscanf(fp, "%c", &N[i] );
    if (isdigit (N[i])) N[i]-='0';
    else i--;
} 

实际上,当我尝试打印N [1]时,输出的是6454646712364,而不是220。 - user3075022
真的吗???N[1]: 3804992 进程返回14(0xE),执行时间:0.006秒 按任意键继续。我不知道发生了什么。 - user3075022
@user3075022 请使用这个在线编译器编译你的代码:http://www.compileonline.com/compile_c_online.php - MOHAMED
它运作了..我的电脑到底哪里出了问题?哈哈,无论如何我会试着看看你发布的内容是否对我有所帮助。 - user3075022
fscanf(fp, "%c" 存在一个问题,即它首先从 fscanf(fp, "%d", &a) 中读取剩余的 \n。更好的方法是使用 fscanf(fp, " %c"(添加空格)来消耗前导空格。 - chux - Reinstate Monica

2
当您使用fscanf与%d格式参数时,它将从文件中检索一个整数类型。由于110和其他内容都是整数,它将直接从文件中获取110。
因此,您可以在循环中使用带有%d参数的fscanf,该循环迭代a次,或者如果您想逐个字符获取它,则可以使用带有%c参数的fscanf,但这需要更多的努力。因此,您应该使用具有%d参数的fscanf,并通过每个数字的循环获取所有数字。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接