使用fscanf读取ASCII代码文件

时间:2014-11-05 04:32:46

标签: c ascii scanf

我正在尝试读取ASCII文本文件并将其写入二进制文件。文本文件的大小不受限制。首先,我在写之前尝试读取文本文件。但是,我一直在分段错误。我不明白可能导致问题的原因。即使使用gdb,我仍然无法弄清楚问题。请指教。

代码:

# include <stdio.h>
# include <stdlib.h>
# include <string.h>

typedef struct _FileData
{
int a;
double b;
char dataStr[56];
}FileData;


int main()
{

FILE * infile=fopen("output.txt", "r");
if(infile==NULL)
{
    printf("Error opening file");
    exit(1);
}

FileData **input;
int i=0;
while( fscanf(infile,"%d %f %[^\n]s",&input[i].a,&input[i].b,&input[i].dataStr)!  =NULL)
{
    printf("%d",input[i].a);
    printf("%.3f",input[i].b);
    printf("%[^\n]s",input[i].dataStr);
    i++;
}
return 0;
}

我的文本文件是

47
34.278
This is a line of text

48
23.678
This a very very long line

49
12.4569
This a very short line

50
117.906
This world is so beautiful

51
34.789
Hello world!

1 个答案:

答案 0 :(得分:2)

代码中的问题是你有一个指针:

FileData** input;

您正在使用该指针,即使它尚未初始化为指向任何有效内存。

由于您在阅读文件后立即将数据写入stdout,因此您可以使用:

FileData input;
while( fscanf(infile,"%d %lf %55[^\n]",&input.a, &input.b, input.dataStr) == 3)
                                                                      // Notice the chage here
{
    printf("%d",input.a);
    printf("%.3f",input.b);
    printf("%s\n",input.dataStr);
}

但是,我不理解struct _FileData的必要性。您可以轻松使用:

int intValue;
double doubleValue;
char stringValue[56];
while( fscanf(infile,"%d %lf %55[^\n]",&intValue, &doubleValue, stringValue) == 3)
{
    printf("%d %.3f %s\n",intValue, doubleValue, stringValue);
}