尝试从文件中读取下一行/字符时出现分段错误[重复]

问题描述 投票:-1回答:1

这个问题在这里已有答案:

我有一个学校项目,我需要在C中读取.ppm文件并将其存储在一个结构中,以便用于以后的任务。一旦我得到第一行并将其分配给struct变量,如果我再次尝试浏览该文件,则会出错。这是我的代码:

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

typedef struct {
    int r, g, b;
} pixels;

typedef struct {
    int width, height, maxColors;
    char *format; //PPM file format
    char *comments;
    pixels *pixels;
} PPM;

PPM *getPPM(FILE * f) {

    // Check if the file is valid. If not then exit the program
    if(f == NULL) {
        perror("Cannot open file: ");
        exit(1);
    }

    PPM *pic = malloc(sizeof(PPM));
    // If memory allocation fails, exit the program.    
    if(!pic) {
        perror("Unable to allocate memory for structure");
        exit(1);
    }

    // Store the first line of file into the structure
    char *fileFormat;

    if(fgets(fileFormat, sizeof(fileFormat), f) != NULL) {
        // If it is a valid .ppm format, then store it in the structure
        if(fileFormat[0] == 'P') 
            pic->format = fileFormat;
    } else {
        perror("Unable to read line from the input file");
        exit(1);
    }

//Errors start here
    int c = getc(f);
    while(c != EOF)
        c = getc(f);

/*
    char *comments;

    if(fgets(comments, sizeof(comments), f) != NULL) {
        printf("%s\n", comments);
    } else {
        perror("Unable to read line from the input file");
        exit(1);
    }
*/
    fclose(f);
    return pic; 
}



int main(int argc, char **argv) {

    PPM *p = getPPM(fopen(argv[1], "r"));
    printf(" PPM format = %s",p->format);
    return 0;
}

我试过从文件中获取单个字符。我尝试使用fgets来读取整行,就像我在上一步中所做的那样(对于fileFormat),但每次它都会发出段错误。我试过看其他例子,但我无法弄清楚问题。我已经在这几个小时,所以任何帮助将不胜感激!

可能是内存分配方式有问题吗?或者,当我尝试读取新行时,是否需要提供某种指向该文件的指针?我尝试在手册页中找到答案,但我无法解决任何问题。

附: while(c!= EOF){c = getc(f);而下一个评论的步骤就是看它是否有效。我想将.ppm文件中的所有信息放入PPM结构中。

c memory struct dynamic-memory-allocation file-read
1个回答
2
投票

你正在读一个未初始化的指针,所以这会崩溃。你需要一个缓冲区:

char *fileFormat = malloc(SIZE_OF_FILE_FORMAT);

另外sizeof(fileFormat)返回指针的大小,在这种情况下不是你想要的。您需要指针指向的缓冲区大小。

© www.soinside.com 2019 - 2024. All rights reserved.