我正在尝试创建一个可以将任何文件读取到二进制文件的exe程序,然后使用这个二进制文件来生成完全相同的文件。
所以我发现我可以使用fopen(content,"rb")
将文件读取为二进制文件,
并使用fwrite
我可以将数据块写入流。但问题是当我fwrite
它似乎并没有复制一切。
例如,我打开的文字中包含31231232131
。当我将其写入另一个文件时,它只复制3123
(前4个字节)。
我可以看到,这是一件非常简单的事情,我很遗憾,但我不知道是什么。
#include <stdio.h>
#include <iostream>
using namespace std;
typedef unsigned char BYTE;
long getFileSize(FILE *file)
{
long lCurPos, lEndPos;
lCurPos = ftell(file);
fseek(file, 0, 2);
lEndPos = ftell(file);
fseek(file, lCurPos, 0);
return lEndPos;
}
int main()
{
//const char *filePath = "C:\\Documents and Settings\\Digital10\\MyDocuments\\Downloads\\123123.txt";
const char *filePath = "C:\\Program Files\\NPKI\\yessign\\User\\008104920100809181000405,OU=HNB,OU=personal4IB,O=yessign,C=kr\\SignCert.der";
BYTE *fileBuf;
FILE *file = NULL;
if ((file = fopen(filePath, "rb")) == NULL)
cout << "Could not open specified file" << endl;
else
cout << "File opened successfully" << endl;
long fileSize = getFileSize(file);
fileBuf = new BYTE[fileSize];
fread(fileBuf, fileSize, 1, file);
FILE* fi = fopen("C:\\Documents and Settings\\Digital10\\My Documents\\Downloads\\gcc.txt","wb");
fwrite(fileBuf,sizeof(fileBuf),1,fi);
cin.get();
delete[]fileBuf;
fclose(file);
fclose(fi);
return 0;
}
答案 0 :(得分:3)
fwrite(fileBuf,fileSize,1,fi);
您确实读过fileSize
个字节,但正在编写sizeof(...)
个字节,即new
返回的指针大小。
答案 1 :(得分:2)
C ++方法:
#include <fstream>
int main()
{
std::ifstream in("Source.txt");
std::ofstream out("Destination.txt");
out << in.rdbuf();
}
答案 2 :(得分:0)
您已交换了fread
和fwrite
的参数。元素大小在元素数量之前。应该是这样的:
fread(fileBuf, 1, fileSize, file);
和
fwrite(fileBuf, 1, fileSize, fi);
另请参阅上述评论:
在{
和}
中加上else子句。缩进不会确定c ++中的块。否则,如果您无法打开文件,您的代码将会崩溃。
编辑:和另一个问题 - 你一直在写sizeof(fileBuf)
个字节是不变的。相反,你应该写出你读过的完全相同的字节数。考虑到代码的其余部分,您可以简单地将sizeof(fileBuf)
替换为fileSize
,就像我上面所做的那样。
答案 3 :(得分:0)
fileBuf = new BYTE[fileSize]; fread(fileBuf, fileSize, 1, file); FILE* fi = fopen("C:\\Documents and Settings\\[...]\gcc.txt","wb"); fwrite(fileBuf,sizeof(fileBuf),1,fi);
fileBuf
是指向BYTE
的指针。你自己宣布,看看:BYTE *fileBuf
。因此sizeof(filebuf)
是sizeof(BYTE *)
。
也许你想要:
fwrite(fileBuf, fileSize, 1, fi);
与早期的fread
电话密切相关。
我强烈建议您捕获I / O函数的返回值并进行检查。