【问题标题】:Extra char's added to end of file when read读取时将额外字符添加到文件末尾
【发布时间】:2023-03-16 15:01:01
【问题描述】:

我正在将一个文件从 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);
}

【问题讨论】:

  • 我不明白你的问题,这显然缺少一些minimal reproducible example,并且可能与SO无关。考虑阅读一些textbook on operating systems
  • 您缺少'\0' 字符串终止符的空间。没有终止符 fileBuffer 不是字符串,使用 "%s" 打印它会调用 UB。仅考虑此printf() 和终结者问题的简单修复:char fileBuffer[fileSize + 1] = {0};
  • 我完全遵循了这一点,但 {0} 抛出“可变大小的对象可能未在 fileSize+1 上初始化:(

标签: c file io operating-system filesystems


【解决方案1】:

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

首先,fileBuffer 包含文件的内容。没关系,除了 printf()%s 需要一个 C 字符串,而不是文件的内容。不同之处在于 C 字符串以空字节 \0 结尾。

然后,您假设文件仅包含文本。如果文件是二进制文件,特别是如果它在某处包含空字节,则您的打印将无法正常工作。

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

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

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

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

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

接下来,您不会处理来自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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-03-20
    • 2019-06-16
    • 2011-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多