我正在尝试读取文件并将文件的内容存储到三个不同的数组中

时间:2015-09-25 12:46:00

标签: c

我正在尝试使用以下代码

读取文件并将文件内容存储到三个不同的数组中
#include<stdio.h>
# define max 10

int main()
{
        char filename[10];
        int at[max],n=0,i;
        float bt[max];
        char pno[max][2];
        printf("Enter the file name :- ");
        scanf("%s",filename);
        FILE *fp=fopen(filename,"r");
        while(fscanf(fp, "%s %d %f" ,pno[n],&at[n],&bt[n])!=EOF)
                n++;

        for(i=0;i<n;i++)
                printf("%s\t%d\t%f\n",pno[i],at[i],bt[i]);
        return 0;
}

我的输入文件是:

p1 0 20.0  
p2 2 15.0 
p3 6 27.0 
p4 4 36.0 

我的输出是:

p1p2p3p4    0   20.000000
p2p3p4  2   15.000000
p3p4    6   27.000000
p4  4   36.000000

我不知道为什么在输出的第一行和p1,p2p3p4和2和3行相同。

1 个答案:

答案 0 :(得分:3)

请记住,C中的字符串有一个特殊的终结符,所以两个字符的字符串实际上需要三个字符长。

如果没有终结符字符的空间,那么fscanf调用会将该特殊终结符写入数组的边界之外,从而导致未定义的行为

修复非常简单,将pno的声明更改为:

char pno[max][3];

您可能还想更改fscanf调用,以确保它不会尝试在数组中存储两个以上(不包括终结符)字符:

fscanf(fp, "%2s %d %f" ,pno[n],&at[n],&bt[n])

如果输入文件以某种方式损坏,这将有所帮助。

您可能还想将条件更改为例如

while (fscanf(...) != 3)

因为它也会检测输入文件的问题。