C:从文件中读取未知长度的未知行数

时间:2015-05-20 08:58:37

标签: c segmentation-fault dynamic-allocation

我正在尝试编写一个程序,读取未知长度的未知行数(使用malloc)并将它们保存到结构中。

当我尝试打印我在结构中保存的内容时,出现了分段错误。

代码:

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

typedef struct line{
    struct line* next_line;
    char* data;
}line;

line* read_line(line* ptrLine, FILE* pFile);

int main(int argc, char *argv[])
{
    if(argc < 2){
        return 2;
    }

    FILE* pFile;

    if((pFile = fopen(argv[1], "r")) == NULL){
        return 1;
    }

    line* list_beginning = NULL;
    line* curr_line;

    curr_line = read_line(list_beginning, pFile);

    while(1){
        if(fgetc(pFile) == EOF) break;
        fseek(pFile, -1, SEEK_CUR);
        curr_line = read_line(curr_line, pFile);
    }

    //printf("%c", (list_beginning->data[0]));
    /*while(curr_line->next_line != NULL){
        unsigned int i = 0;
        for(i = 0; i < strlen(curr_line->data); i++){
            printf("%c", curr_line->data[i]);
        }
    }*/

    fclose(pFile);
    return 0;
}

line* read_line(line* ptrLine, FILE* pFile){

    ptrLine = malloc(sizeof(line));

    ptrLine->data = malloc(1024*sizeof(char));
    int curr_position = 0;
    char c;

    while(1){
        c = fgetc(pFile);
        if(c == '\n' || c == EOF) {
            *(ptrLine->data + curr_position) = '\0';
            break;
        }
        *(ptrLine->data + curr_position) = c;
        curr_position++;
    }

    ptrLine->next_line = NULL;
    return ptrLine->next_line;
}

2 个答案:

答案 0 :(得分:0)

line* read_line(line* ptrLine, FILE* pFile){

ptrLine = malloc(sizeof(line));

ptrLine->data = malloc(1024*sizeof(char));
int curr_position = 0;
char c;

while(1){
    c = fgetc(pFile);
    if(c == '\n' || c == EOF) {
        *(ptrLine->data + curr_position) = '\0';
        break;
    }
    *(ptrLine->data + curr_position) = c;
    curr_position++;
}

ptrLine->next_line = NULL;
return ptrLine->next_line;

}

在这段代码中,最后两行不好:

  ptrLine->next_line = NULL
  return ptrLine->next_line;

你将next_line设置为NULL并返回它,这样你的“read_line”函数就会返回“NULL” 为了避免这种情况,请改变最后一行:

   return ptrLine;

答案 1 :(得分:0)

查看您的read_line功能。第一个参数是什么?我假设您要构建line结构的链接列表,因此第一个参数是&#39; head&#39;链表。由于您正在调用函数,因此该参数的位于堆栈中,但是您通过调用malloc覆盖该

在功能结束时,您将next_line字段设置为NULL并返回该字段。这也是不正确的,这是你获得SegFault的主要原因。

最简单的解决方法是在此函数中创建一个新变量,比如new_line,并在整个函数中使用它。然后,最后将next_line字段设置为ptrLine参数并返回new_line

我所描述的行动不仅仅是编写实际代码,而是让你思考要做什么。