将CSV读入数组,按行中给出的数字进行数字排序

时间:2014-01-30 09:32:11

标签: c arrays scanf fault

我尝试读取包含多行的临时文件,如下例所示。这些行没有排序。

3;NOK
2;OK
1;NA

对于一个简单的输出功能,我希望提供多种输出可能性(CSV,在屏幕上打印......),我认为这样做会很聪明。

  1. 打开文件
  2. 迭代
  3. 在开头提取数字
  4. 将其用作数组的索引
  5. 结果应为“已排序”数组
  6. 给我一​​个分段错误的最小例子。

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

1 个答案:

答案 0 :(得分:2)

问题中显示的代码有两个主要问题。首先是output_array中的所有指针都指向同一个地方。这意味着当您打印行时,所有行都将打印相同的内容(这将是读取的最后一行)。

第二个问题是你的数组索引。数组索引从零到大小减去1,因此对于output_array,索引为02(包括)。导致崩溃的问题是您使用的索引3超出了数组范围,并导致未定义的行为