gpt4 book ai didi

无法通过 C 中的 fwrite 和 fread 复制文本文件

转载 作者:行者123 更新时间:2023-11-30 18:24:06 26 4
gpt4 key购买 nike

这是代码:

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

int main() {
FILE *f, *fp;
char buff[512];
int buff_size;
int bytes;

fp = fopen("File.txt", "rb");

if (fp == NULL) {
printf("Cannot Open Source File!\n");
exit(1);
}

f = fopen("append.txt", "ab+");

if (f == NULL) {
printf("Cannot Open Target File!\n");
fclose(fp);
exit(1);
}

buff_size = sizeof(buff);

while (bytes = fread(&buff, buff_size, 1, fp) > 0) {
if (bytes > 0)
fwrite(&buff, buff_size, 1, f);
else
break;

printf("Appending...\n\n");
}

rewind(f);

while (bytes = fread(&buff, buff_size, 1, f) > 0)
if (bytes > 0)
printf("%s", buff);


fclose(fp);
fclose(f);
}

所以,它恰好没有输出任何内容,当我检查文件“append.txt”时,它也不包含任何内容。请注意,源文件“File.txt”不为空。谁能告诉我这是怎么回事?

编辑:

我通过替换 buff_size 解决了这个问题与 strlen(buff)像这样: bytes = fread(&buff, strlen(buff), 1, f) > 0fwrite() 相同第二个fread() .

有人能解释一下为什么会这样吗?

最佳答案

char buff[512];
int buff_size;

// [...]

bytes = fread(&buff, buff_size, 1, fp)

这将尝试读取 512 字节的一个 block 。返回值是读取的 block 数,因此不会是字节。但抛开这一点,如果您的文件小于 512 字节,则不会读取任何内容。

您想要的是读取 512 次 1 个字节,然后您将得到字节计数,因此将位置交换为 buff_size1 .

<小时/>

旁注:

  • 如果您在循环条件中正确执行检查,例如:

    while ((bytes = fread(buff, 1, buff_size, fp)) > 0 )

    额外检查if (bytes > 0)是多余的。

  • 写入时,您只想写入实际读取的字节数:

    fwrite(buff, 1, bytes, f);
  • 对于尺寸,请始终使用 size_t -- int很可能是错误的:

    size_t buff_size;
    size_t bytes;
  • 打印您的buffprintf("%s", )未定义的行为,因为您没有添加 '\0' fread() 读取数据后的字节。 C 字符串必须以 '\0' 结尾。当fread()读取数据时不包含'\0'偶然,printf()将读取和使用未初始化的数据,甚至可能读取超出 buff 范围的数据.

关于无法通过 C 中的 fwrite 和 fread 复制文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44740888/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com