我尝试读取包含多行的临时文件,如下例所示。这些行没有排序。
3;NOK
2;OK
1;NA
对于一个简单的输出功能,我希望提供多种输出可能性(CSV,在屏幕上打印......),我认为这样做会很聪明。
给我一个分段错误的最小例子。
#include <stdlib.h>
#include <stdio.h>
int main (int argc, char *argv[]){
FILE *outfp = fopen("test.txt", "r");
if (outfp == NULL){
printf("There was a problem: Temporary output-file could not be opened");
return 1;
}
// OUTPUT HANDLING
char output_line[1024];
char output_cut[1024];
int line_number;
char *output_array[3]; //The maximum number of possible entries is fixed
// I got variables for the line, for the linenumber and output_cut is needed for sscanf
while(fgets(output_line, sizeof(output_line), outfp)!=NULL){
sscanf(output_line,"%d;%s",&line_number,output_cut);
output_array[line_number]=output_line;
}
printf("LINE1:%s",output_array[1]);
printf("LINE2:%s",output_array[2]);
printf("LINE3:%s",output_array[3]);
return 0;
}
我的第一个问题:这是正确的方法,还是有其他更好的方法可以轻松地“排序”这种文件以获得灵活的输出? 如果是的话,为什么这不起作用?
此致 马库斯
编辑:示例文本文件只包含1-3中的数字...而不是13,14 ...
Edit2:解决方案
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main (int argc, char *argv[]){
FILE *outfp = fopen("test.txt", "r");
if (outfp == NULL){
printf("There was a problem: Temporary output-file could not be opened");
return 1;
}
// OUTPUT HANDLING
char output_line[1024];
char output_cut[1024];
int line_number;
char output_array[4][1024]; //The maximum number of possible entries is fixed
// I got variables for the line, for the linenumber and output_cut is needed for sscanf
while(fgets(output_line, sizeof(output_line), outfp)!=NULL){
sscanf(output_line,"%d;%s",&line_number,output_cut);
strcpy(output_array[line_number],output_line);
}
printf("LINE1: %s",output_array[1]);
printf("LINE2: %s",output_array[2]);
printf("LINE3: %s",output_array[3]);
return 0;
}
答案 0 :(得分:2)
问题中显示的代码有两个主要问题。首先是output_array
中的所有指针都指向同一个地方。这意味着当您打印行时,所有行都将打印相同的内容(这将是读取的最后一行)。
第二个问题是你的数组索引。数组索引从零到大小减去1,因此对于output_array
,索引为0
到2
(包括)。导致崩溃的问题是您使用的索引3
超出了数组范围,并导致未定义的行为。