只是这个:
int size = getFileSize(path); //Listed below
ifstream fs(path, ios::in);
ofstream os(path2, ios::out);
//Check - both streams are valid
char buff[CHUNK_SIZE]; //512
while (size > CHUNK_SIZE)
{
fs >> buff;
os << buff;
size -= CHUNK_SIZE;
}
char* dataLast = new char[size];
fs>>dataLast;
os<<dataLast;
fs.close();
os.close();
//基于SO,效果很好
int getFileSize(string path)
{
FILE *pFile = NULL;
if (fopen_s( &pFile, path.c_str(), "rb" ))
{
return 0;
}
fseek( pFile, 0, SEEK_END );
int Size = ftell( pFile );
fclose( pFile );
return Size;
}
path2上的文件已损坏,并且小于1 Kb。(初始文件为30Kb);我不需要有关如何复制文件的建议,我很想知道此示例有什么问题。
首先是一个重要的警告:切勿(如过去一样)在char*
不设置width()
!的情况下使用格式化输入运算符。您将自己打开到缓冲区溢出。基本上,这是C ++的编写版本,gets()
它的性能足以将其从C标准中删除(而不仅仅是弃用)!如果您坚持使用带格式的输入char*
(通常最好使用std::string
),请设置宽度,例如:
char buffer[512];
in >> std::setw(sizeof(buffer) >> buffer;
好的,顺便说一句:看来您实际上是想更改两件重要的事情:
operator>>()
:格式化输入运算符从跳过空格开始。当读入char*
它时,到达空白时也会停止(或者当width()
读了很多字符并且仍然有空间存储终止零时,当其为非零值时;请注意,在每次读取之后,该集width()
将重置为0
)。那就是您可能想使用无格式的输入,例如,in.read(buffer, sizeof(buffer))
它设置in.gcount()
为实际读取的字符数,例如,在流的末尾,该字符数可能小于size参数。std::ios_base::binary
模式下打开文件。尽管在某些系统(例如POSIX系统)上没有关系,但是在某些以文本模式阅读的系统上,它会将例如\r\n
Windows上的行结束序列合并到行末字符中\n
。同样,\n
在文本模式下编写a时,在某些系统上它将被换行符替换,即,您可能还希望在文本模式下打开输出流。本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句