C - 分段故障(核心转储),从文件读取前N个字节

时间:2016-02-11 19:30:29

标签: c file fwrite fread

我编写了一些代码来从二进制文件中读取第一个pos字节并将其写入另一个文件。当我运行它时,我得到了分段错误。这是代码:

void outputUntillPos(const char * inFileName, const char * outFileName, int pos) {
FILE * inFile = fopen(inFileName, "r");
FILE * outFile = fopen(outFileName, "aw");

char buf[1024];
int read = 0;
int remain = pos;

do {
    if(remain <= 1024) {
        read = fread(buf, 1, pos, inFile);
    } else {
        read = fread(buf, 1, 1024, inFile);
    }

    remain -= read;
    fwrite(buf, 1, read, outFile);
    memset(buf, 0, 1024);
} while(remain > 0);
}

我是否在这里进行了超出范围的操作?

编辑:感谢所有帮助,这里是编辑过的代码。

void outputUntillPos(const char * inFileName, const char * outFileName, int pos) {
FILE * inFile = fopen(inFileName, "r");
FILE * outFile = fopen(outFileName, "aw");

char buf[1024];
int read = 0;
int remain = pos;

if((inFile != NULL) && (outFile != NULL)) {
    do {
        if(remain <= 1024) {
            read = fread(buf, 1, remain, inFile);
        } else {
            read = fread(buf, 1, 1024, inFile);
        }

        remain -= read;
        fwrite(buf, 1, read, outFile);
        memset(buf, 0, 1024);
    } while(remain > 0 && read > 0);
}

fclose(inFile);
fclose(outFile);
}

2 个答案:

答案 0 :(得分:0)

remain变为&lt; = 1024且输入了if部分时,您将以pos个字节读取,如果它更大1024将写入缓冲区的末尾。这就是导致段错误的原因。

您想在此使用remain

if(remain <= 1024) {
    read = fread(buf, 1, remain, inFile);
} else {
    read = fread(buf, 1, 1024, inFile);
}

另外,请务必先检查fopen的返回值,然后再返回fclose(inFile)fclose(outFile)

答案 1 :(得分:0)

当要读取的剩余字节数(在变量remain中)变得小于1024时,由于某种原因,您尝试读取pos个字节。为什么pos ???您应该在最后一次迭代中读取remain个字节,而不是pos个字节。

如果pos大于1024且输入文件仍有额外数据,那么当然您将在最后一次迭代时超出缓冲区。