gpt4 book ai didi

c++ - ifstream 和 ofstream 问题

转载 作者:行者123 更新时间:2023-11-30 01:55:34 26 4
gpt4 key购买 nike

就是这样:

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;
}

路径 2 的文件已损坏且小于 1 Kb。 (初始文件为 30Kb);我不需要如何复制文件的建议,我很好奇这个例子有什么问题。

最佳答案

首先是一个重要警告:从不(真的从不)使用格式化输入操作符char* without 设置 width()!您打开了缓冲区溢出的大门。这基本上是编写 gets() 的 C++ 版本,它非常糟糕,需要从 C 标准中删除(不仅仅是弃用)!如果您坚持使用带有 char* 的格式化输入(通常您最好使用 std::string),请设置宽度,例如:

char buffer[512];
in >> std::setw(sizeof(buffer) >> buffer;

好吧,除了这个:看起来你真的想改变两件重要的事情:

  1. 您可能不想使用格式化输入,即 operator>>():格式化输入运算符从跳过空格开始。当读入 char* 时,它也会在到达空格时停止(或者当 width() 非零时读取了很多字符并且仍有空间来存储终止符零;注意集合 width() 将在每次读取后重置为 0)。那就是你可能想使用未格式化的输入,例如 in.read(buffer, sizeof(buffer))in.gcount() 设置为实际的字符数读取可能小于大小参数,例如,在流的末尾。
  2. 您可能应该以std::ios_base::binary 模式打开文件。尽管在某些系统(例如 POSIX 系统)上无关紧要,但在某些以文本模式读取的系统上合并行尾序列,例如\r\n 在 Windows 上,进入行结束符 \n。同样,当在文本模式下编写 \n 时,它会在某些系统上被行结束序列替换,即,您可能还想在文本模式下打开输出流。

关于c++ - ifstream 和 ofstream 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20596924/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com