将文本文件复制到数组

时间:2016-11-21 08:30:12

标签: c pointers

我应该将fp复制到行。 我首先在fp找到文本的长度 然后我使用fgets动态分配行并检索文本。 我一直在自动评分机上得到“Your return code was -11 but it was supposed to be 0”。这当然只是代码的一部分。我有一个makefile和main。 我的seg故障在哪里?

void read_lines(FILE* fp, char*** lines, int* num_lines){

    int num_chars=0;

    int index=0;

    int lengths[index];

    int i=0;

    //find the length of the rows n cols in fp

    //while there is still character in the text
    while(!feof(fp)){
        //get that character
        char current_char= fgetc(fp);
        //implement the number character
        num_chars++;

        //enter at the end of the first then each line
        if(current_char=='\n'){
            //find the length of the next line of sentence/word.
            // This array stores the length of characters of each line
            lengths[index]= num_chars;
            //update index
            index++;

         // Reset the number of characters for next iteration
           num_chars = 0;
            // Increment the number of lines read so far
            (*num_lines)++;
        }

    }


    //now we need to copy the characters in fp to lines
    (*lines)=(char**) malloc((*num_lines)*sizeof(char*));
    for(i=0;i<*num_lines;i++){
        (*lines)[i]=(char*)malloc(lengths[i]*sizeof(char));
        fgets(*lines[i],(lengths[i]+1),fp);
        fseek(fp,0,SEEK_SET);
        }
    }

3 个答案:

答案 0 :(得分:0)

我在这里看到两个问题。

首先,长度静态分配零字节。这可以而且永远不会奏效。您需要创建一个具有最大大小(例如,最多256行)的长度数组,或者将长度设置为链接列表,以便它可以随索引一起增长。或者,您可以在文件中进行两次传递 - 一次获取行数(在此之后分配行数组),一次获取每行的字符数。

其次,虽然它是一个挑剔,但你可以通过从while循环中删除num_lines来大大简化代码。在循环之后,只需设置

*num_lines = index;

答案 1 :(得分:0)

段错误的原因是你以错误的方式传递行指针

fgets(*lines[i],(lengths[i]+1),fp);

正确的方法是: -

fgets((*lines)[i],(lengths[i]+1),fp);

答案 2 :(得分:0)

像这样修复

&#xA;&#xA;
  void read_lines(FILE * fp,char *** lines,int * num_lines){&#xA; int num_chars = 0;&#xA; / * int index = 0; int lengths [index]; // length [0]是坏的。 * /&#XA; int ch,i = 0,max_length = 0;&#xA;&#xA; while((ch = fgetc(fp))!= EOF){// while(!feof(fp)){很糟糕。因为它再次循环。&#xA; NUM_CHARS ++;&#XA; if(ch =='\ n'){&#xA; ++ i; // count line&#xA; if(num_chars&gt; max_length)&#xA; max_length = num_chars;&#xA; //重置&#XA; num_chars = 0;&#xA; }&#XA; }&#XA; if(num_chars!= 0)//最后一行没有换行&#xA; ++ I;&#XA; * num_lines = i;&#xA;&#xA;倒带(fp); //需要倒带&#xA; char * line = malloc(max_length + 1);&#xA; * lines = malloc(* num_lines * sizeof(char *));&#xA; for(i = 0; i&lt; * num_lines; i ++){&#xA; fgets(line,max_length + 1,fp);&#xA; (* lines)[i] = malloc(strlen(line)+1);&#xA; strcpy((* lines)[i],line);&#xA; }&#XA;自由(线);&#XA;}&#XA;  
&#XA;