读取文件并保存相同的文件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。