我不明白fgets是如何创建seg-fault的

时间:2015-12-09 00:08:20

标签: c file-io stdio

我有一个编写程序的任务,该程序复制需要2个参数(filePaths)并将第一个文件复制到第二个文件中。 据我所知,我应该使用fgets。 我有什么似乎工作,直到我无法检测到文件的结尾。根据我读过的所有内容,似乎fgets应该在它到达文件末尾时停止并返回null或者其他东西,但如果我让它继续读取文件的最后一行。 这是代码。我不想要答案(这是家庭作业),我只是想了解我在做什么,所以我可以自己得到答案:

#include <stdio.h>
#define BUFFER_SIZE 80

int readLineFromFile(FILE* file, char* buffer) {

    if(! *fgets(buffer, BUFFER_SIZE, file)) {
        return -1;
    }
    int length;
    for(length=0; buffer[length] != '\0'; length++);
    return length;
}

void writeLineToFile(FILE* file, char* buffer) {
    fprintf(file, "%s", buffer);
}

int main(int argc, char **argv) {
    if (argc != 3) {
        printf("incorrect number of arguments, 2 text files expected, recieved %d\n", argc - 1);
        return 0;
    }
    FILE* input = fopen(argv[1], "r");
    FILE* output = fopen(argv[2], "w");
    char buffer[BUFFER_SIZE];
    int charsRead = readLineFromFile(input, buffer);
    int i;
    while(0 < charsRead) {
        writeLineToFile(output, buffer);
        charsRead = readLineFromFile(input, buffer);
        printf("%d\n", i++);
    }
    fclose(input);
    fclose(output);
    return 0;
}

1 个答案:

答案 0 :(得分:1)

我认为问题在于if(! *fgets(buffer, BUFFER_SIZE, file)) {中的解除引用功能。我将*fgets更改为fgets并且运行正常。查看正确的代码here。但是为了获得额外的功劳,请弄清楚如何使用任何文件类型,而不仅仅是纯文本。