读取文件并保存相同的文件c++; 我实际上正在编写一个C++程序,它读取任何类型的文件并将其保存为BMP文件,但首先我需要读取该文件,而问题是 char fileName[] = "test.jpg"; FILE * inFileForGettingSize;//This is for getting the file size fopen_s(&inFileForGettingSize, fileName, "r"); fseek(inFileForGettingSize, 0L, SEEK_END); int fileSize = ftell(inFileForGettingSize); fclose(inFileForGettingSize); ifstream inFile;//This is for reading the file inFile.open(fileName); if (inFile.fail()) { cerr << "Error Opening File" << endl; } char * data = new char[fileSize]; inFile.read(data, fileSize); ofstream outFile;//Writing the file back again outFile.open("out.jpg"); outFile.write(data, fileSize); outFile.close(); cin.get();

读取文件并保存相同的文件c++; 我实际上正在编写一个C++程序,它读取任何类型的文件并将其保存为BMP文件,但首先我需要读取该文件,而问题是 char fileName[] = "test.jpg"; FILE * inFileForGettingSize;//This is for getting the file size fopen_s(&inFileForGettingSize, fileName, "r"); fseek(inFileForGettingSize, 0L, SEEK_END); int fileSize = ftell(inFileForGettingSize); fclose(inFileForGettingSize); ifstream inFile;//This is for reading the file inFile.open(fileName); if (inFile.fail()) { cerr << "Error Opening File" << endl; } char * data = new char[fileSize]; inFile.read(data, fileSize); ofstream outFile;//Writing the file back again outFile.open("out.jpg"); outFile.write(data, fileSize); outFile.close(); cin.get();,c++,file-io,C++,File Io,转到: assdassaasd sdaasddsa sdadsaÍÍÍ 所以当我用jpg、exe等来做这件事时,它会破坏它。 我不是想复制一个文件,我知道还有其他方法,我只是想每字节读取一个完整的文件字节。谢谢 编辑: 我发现这些“Í”等于文件的结束行数,但这对我没有多大帮助,这是由以下原因造成的 您以文本模式打开文件(因为您对fopen使用“r”而不是“rb”,并且因为您没有将ios::binary传递给fstream打开调用),在Windows上,文本模式将“\r\n”对转换为“\n”,

转到:

assdassaasd

sdaasddsa
sdadsaÍÍÍ
所以当我用jpg、exe等来做这件事时,它会破坏它。 我不是想复制一个文件,我知道还有其他方法,我只是想每字节读取一个完整的文件字节。谢谢

编辑:

我发现这些“Í”等于文件的结束行数,但这对我没有多大帮助,这是由以下原因造成的

您以文本模式打开文件(因为您对
fopen
使用
“r”
而不是
“rb”
,并且因为您没有将
ios::binary
传递给
fstream
打开调用),在Windows上,文本模式将
“\r\n”
对转换为
“\n”
,再返回到
”\r\n“
在编写时。结果是,内存中的大小将比磁盘上的大小短,因此当您尝试使用磁盘上的大小进行写入时,您将越过阵列的末尾,写入内存中发生的任何随机内容

使用二进制数据时,需要以二进制模式打开文件:

fopen_s(&inFileForGettingSize, fileName, "rb");

inFile.open(fileName, ios::binary);

outFile.open("out.jpg", ios::binary);
作为将来的参考,您的复制程序可能会有所改进。将
FILE*
I/O与
iostream
I/O混合在一起感觉很尴尬,打开和关闭文件两次都是额外的工作,而且(最重要的是),如果例程在足够大的文件上运行,尝试将整个文件加载到RAM时会耗尽内存。一次复制一个块会更好:

const int BUFFER_SIZE = 65536;
char buffer[BUFFER_SIZE];

while (source.good()) {
  source.read(buffer, BUFFER_SIZE);
  dest.write(buffer, source.gcount());
}
这是由于

您以文本模式打开文件(因为您对
fopen
使用
“r”
而不是
“rb”
,并且因为您没有将
ios::binary
传递给
fstream
打开调用),在Windows上,文本模式将
“\r\n”
对转换为
“\n”
,再返回到
”\r\n“
在编写时。结果是,内存中的大小将比磁盘上的大小短,因此当您尝试使用磁盘上的大小进行写入时,您将越过阵列的末尾,写入内存中发生的任何随机内容

使用二进制数据时,需要以二进制模式打开文件:

fopen_s(&inFileForGettingSize, fileName, "rb");

inFile.open(fileName, ios::binary);

outFile.open("out.jpg", ios::binary);
作为将来的参考,您的复制程序可能会有所改进。将
FILE*
I/O与
iostream
I/O混合在一起感觉很尴尬,打开和关闭文件两次都是额外的工作,而且(最重要的是),如果例程在足够大的文件上运行,尝试将整个文件加载到RAM时会耗尽内存。一次复制一个块会更好:

const int BUFFER_SIZE = 65536;
char buffer[BUFFER_SIZE];

while (source.good()) {
  source.read(buffer, BUFFER_SIZE);
  dest.write(buffer, source.gcount());
}

它是一个二进制文件,所以你需要读写二进制文件;否则它将被视为文本,并假设有需要翻译的新行

在对fopen()的调用中,需要添加“b”指示符:

fopen_s(&inFileForGettingSize, fileName, "rb");
在fstream::open调用中,需要添加std::fstream::binary:

inFile.open(fileName, std::fstream::binary);
// ...
outFile.open("out.jpg", std::fstream::binary);

它是一个二进制文件,所以你需要读写二进制文件;否则它将被视为文本,并假设有需要翻译的新行

在对fopen()的调用中,需要添加“b”指示符:

fopen_s(&inFileForGettingSize, fileName, "rb");
在fstream::open调用中,需要添加std::fstream::binary:

inFile.open(fileName, std::fstream::binary);
// ...
outFile.open("out.jpg", std::fstream::binary);

或者用“ios::binary”代替“std::fstream::binary”;它们都引用相同的常量。或者“ios::binary”而不是“std::fstream::binary”;它们都引用相同的常数。哦。。。谢谢我正在研究,非常感谢。:)哦谢谢我正在研究,非常感谢。:)您可以使用fstream进行seek/tell,因此不确定为什么需要使用C I/O。您可以使用fstream进行seek/tell,因此不确定为什么需要使用C I/O。