使用fscanf读取ASCII代码文件

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

码:

# include  # include  # include  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! 

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

 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); }