如何正确地fread()和fwrite()非文本文件?

时间:2016-12-12 22:34:48

标签: c++ fwrite fread

这是我第一次使用fread()fwrite()功能。所以我正在学习如何处理它们。对于文本文件,我已经成功地设法读取a然后在另一个函数中创建一个文件。但是,每当我尝试使用非文本文件时,它们只会输出损坏。我在这里问,因为我没有通过互联网搜索此事的成功结果。

简而言之:我将数据收集从我在服务器上打开的文件发送到客户端,然后客户端尝试使用解析的数据创建确切的文件。

那么,让我解释一下我是怎么做到的: 我以二进制模式打开一个非文本文件:

FILE* myfile = fopen(fullPath.c_str(), "rb");

然后我创建一个循环来读取文件:(由于某种原因,我发现非文本文件的实际大小等于size/4

int readPos = 0;
std::string externalBuffer;

while (true) {
    unsigned char buffer[1024];
    int bytesRead = 0;

    bytesRead += fread(buffer, sizeof(unsigned char), 1024, upfile);    

    if (bytesRead == 0)
        break;

    externalBuffer = unsigned_char_to_string(buffer, bytesRead); //This simple function loops over the buff and converts each entry to the string -> the results are numbers from 0-255

//Here I convert the buffer to a string and send it to the client to be parsed and add to a string buffer like: dataChunk += parsedString;

//clear buffers

}

现在我在客户端解析字符串sucessfuly(我不确定腐败问题是否在于我将缓冲区转换为字符串)。 在发送循环的所有数据之后。客户端尝试使用缓冲区dataChunk:

写入
FILE* myfile = fopen(fullPath.c_str(), "wb+");
fwrite(dataChunk.c_str(), sizeof(char), dataChunk.size(), myfile);
fclose(myfile);

我已经尝试将发送的数据转换为十六进制字符串,将每个条目从0到255转换为十六进制并写入新文件。我还尝试将dataChunk字符串转换为unsigned char数组。但我所有的尝试导致文件损坏。我使用此方法尝试创建可执行文件和png图像。 我还看到了一些示例然后fopen并一次复制所有文件,然后fwrite在同一函数的新创建文件中使用看起来对它们起作用的unsigned char。

那么,这段代码出了什么问题?为什么它没有输出完美的文件?我错误地使用了fread()fwrite()吗?

1 个答案:

答案 0 :(得分:0)

使用@Barmar更正。 我将unsigned_char_to_string函数更改为此代码:

std::string externalBuffer(&buffer[0], &buffer[0] + bytesRead);

它完美无缺!

谢谢@Barmar!对不起,这是一个noobish :)你结识了我的一天!