gpt4 book ai didi

c - fread 和 fwrite 结果文件大小不同

转载 作者:行者123 更新时间:2023-12-02 18:06:02 27 4
gpt4 key购买 nike

我正在 Visual Studio 中编写一个程序。我使用 freadfwrite 复制了一个文件。输出文件大小比输入文件大。能解释一下原因吗?

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>

int main()
{
char *buffer;
int fsize;

FILE *fp = fopen("test.txt", "r");
FILE *ofp = fopen("out.txt", "w");
fseek(fp, 0, SEEK_END);
fsize = ftell(fp);

buffer = (char *)malloc(fsize);
memset(buffer, 0, fsize); // buffer를 0으로 초기화

fseek(fp, 0, SEEK_SET);
fread(buffer, fsize, 1, fp);

fwrite(buffer, fsize, 1, ofp);

fclose(fp);
fclose(ofp);
free(buffer);
}

最佳答案

您以文本模式打开文件,在 Windows 操作系统上使用 Visual Studio 涉及重要的翻译阶段,包括行尾转换。如果您的文件包含二进制内容,例如可执行文件、图像和文档文件,行尾转换会将“\n”字节替换为 CR LF 对,从而增加输出大小。

您可以通过使用 "rb""wb" 模式字符串以二进制模式打开文件来避免此问题。

另请注意,假设文件支持查找且不大于 LONG_MAX,则必须以二进制模式打开流,ftell() 才能可靠地返回文件大小Windows 上只有 2GB。对于 POSIX 系统来说,使用 stat 从操作系统检索文件大小是更好的方法。一次复制一个文件 block 也更可靠:它适用于不支持查找的流,并允许复制大于可用内存的文件。

这是带有错误检查的修改版本:

#ifdef _MSC_VER
#define _CRT_SECURE_NO_WARNINGS
#endif

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

int main() {
const char *inputfile = "test.txt";
const char *outputfile = "out.txt";

FILE *fp = fopen(inputfile, "rb");
if (fp == NULL) {
fprintf(stderr, "cannot open %s: %s\n", inputfile, strerror(errno);
return 1;
}

FILE *ofp = fopen(outputfile, "wb");
if (ofp == NULL) {
fprintf(stderr, "cannot open %s: %s\n", outputfile, strerror(errno);
return 1;
}

if (fseek(fp, 0, SEEK_END)) {
fprintf(stderr, "%s: cannot seek to the end of file: %s\n",
inputfile, strerror(errno);
return 1;
}

size_t fsize = ftell(fp);

char *buffer = calloc(fsize, 1);
if (buffer == NULL) {
fprintf(stderr, "cannot allocate %zu bytes: %s\n",
fsize, strerror(errno);
return 1;
}

rewind(fp);
size_t nread = fread(buffer, fsize, 1, fp);
if (nread != fsize) {
fprintf(stderr, "%s: read %zu bytes, file size is %zu bytes\n".
inputfile, nread, fsize);
}

size_t nwritten = fwrite(buffer, nread, 1, ofp);
if (nwritten != nread) {
fprintf(stderr, "%s: wrote %zu bytes, write size is %zu bytes\n".
outputfile, nwritten, nread);
}
fclose(fp);
if (fclose(ofp)) {
fprintf(stderr, "%s: error closing file: %s\n".
outputfile, strerror(errno));
}
free(buffer);
return 0;
}

关于c - fread 和 fwrite 结果文件大小不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/73231006/

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