读取时将多余的字符添加到文件末尾

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

我正在将文件从linux复制到我们的文件系统,我们已经成功完成了该操作,但是当文件打印出来时,文件末尾会有多余的字符。我们认为这与内存分配有关,但是我们看不到如何解决它。感谢您的帮助!

实际EOF:∴但是TM不可能决定H,所以M_o不可能存在。} 0E。

[正确的EOF:∴但是TM不可能决定H,所以M_o不可能存在。

void copyToFS(char *filePath, int currentDirectoryID)
{
    printf("Enter file path: ");
    scanf("%s",filePath);
    int node = assignNode(filePath, 0, currentDirectoryID);
    long int fileSize = getFileSize(filePath);

    FILE *file  = fopen(filePath, "r");

    printf("\nSize of : %ld", fileSize);

    char fileBuffer[fileSize];

    if (file != NULL) {
        fseek(file, 0, SEEK_SET);
        fread(fileBuffer, fileSize, 1, file);

    } else {
        printf("Could not open file :(");
    }

    fclose(file);

    printf("\n%s", fileBuffer);

    assignBlocks(fileBuffer, node, fileSize/512);
}
c file io operating-system filesystems
1个回答
0
投票

这里有几个问题。让我们从与您的问题有关的一个开始:

首先,fileBuffer包含文件的内容。可以,除了printf()%s需要C字符串,而不是文件的内容。区别在于,C字符串以空字节\0结尾。

然后,您假设文件仅包含文本。如果文件是二进制文件,尤其是在某个位置包含空字节的文件,则无法打印。

如何解决两个问题:使用fwrite(),不需要空字节:替换

printf("\n%s", fileBuffer);

with

fwrite("\n", sizeof("\n"), 1, STDOUT);
fwrite(fileBuffer, fileSize, 1, STDOUT);

接下来,假设文件大小。如果文件大小为16MB,则尝试在堆栈上分配16MB的内存,这会使程序崩溃。

如何解决:要么断定假设(if (fileSize > SOMETHING) return;或类似的东西,要么用fileBuffer动态分配malloc()

接下来,您没有处理fread()中的错误。如果失败,fread()将返回0。

如何解决:防弹方式是像这样的循环:

while (!feof(file)) {
    fread(fileBuffer, fileSize, 1, file);
}

但是,如果您的文件可能很大,fread()可能只读取其中一部分,则您需要:

n = 0;
while (!feof(file)) {
    r = fread(fileBuffer + n, 1, fileSize, file);
    n += r;
}

注意,当您写文件时(假设是在assignBlocks()中,如果使用fwrite(),还需要一个类似于fread()的循环。

[最后,我猜想fileSize/512应该是文件中扇区的数目,但是如果文件长1500字节,它将具有3个扇区,而fileSize/512的取值为2。

如何解决:用fileSize/512替换(fileSize + 511) / 512

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