简介:
我正在从文本文件中读取ReadFile。传递到ReadFile
的缓冲区将被发送到标准输出cout。标准输出被重定向到一个文本文件。文件大小比应该大,增加了新的行数
问题:
虽然我的代码“作品”,不会丢失数据,生成的文件比原来的大。
在记事本中打开时,一切似乎都很好,但在中打开时,我可以清楚地看到添加了多余的行。这些行是新行(\n
)。
MVCE重现此行为的内容在下面提交。
#include <iostream>
#include <Windows.h>
int main()
{
HANDLE hFile = ::CreateFile("C:\\123.txt",
GENERIC_READ,
FILE_SHARE_READ |
FILE_SHARE_WRITE |
FILE_SHARE_DELETE,
NULL,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (INVALID_HANDLE_VALUE == hFile)
return ::GetLastError();
char buffer[256];
DWORD bytesRead = 1, // dummy value so while loop can work
bytesWritten = 0; // needed for WriteFile, not for cout version
//======== so WriteFile outputs to console, not needed for cout version
HANDLE hStandardOutput = ::GetStdHandle(STD_OUTPUT_HANDLE);
if (INVALID_HANDLE_VALUE == hStandardOutput)
{
std::cout << "GetStdHandle error code = " << ::GetLastError() << std::endl;
::CloseHandle(hFile);
return ::GetLastError();
}
//============================
while(bytesRead)
{
// '\0' terminate buffer, needed for cout only
::memset(buffer, '\0', sizeof(buffer));
if (!::ReadFile(hFile,
buffer,
sizeof(buffer) - 1, // - 1 for '\0', not needed when using WriteFile
&bytesRead, NULL))
{
std::cout << "ReadFile error code = " << ::GetLastError() << std::endl;
break;
}
/*============= Works fine
if(!::WriteFile(hStandardOutput, buffer, bytesRead, &bytesWritten, NULL))
{
std::cout << "WriteFile error code = " << ::GetLastError() << std::endl;
break;
}*/
//------------- comment out when testing WriteFile
std::cout << buffer; // extra lines...
// std::cout.write(buffer, bytesRead); // extra lines as well...
//----------------------------------------
}
::CloseHandle(hFile);
return 0;
}
问题:
是什么原因造成上述现象?如何解决它?
我的努力解决问题:
当我键入这个职位,我漫无目的的谷歌搜索,希望能有些线索出现。
我怀疑问题在于输出\n
时,似乎Windows也插入\r
,但我不确定。
这都没有关系文件。只有'std :: cout <<'如何工作 – RbMm
@RbMm:你能解释一下,还是提供一个解释为什么会发生这种情况的链接?谢谢你的评论(我没有忘记你的其他IO完成端口的答案,我正在与此问题平行)。 – AlwaysLearningNewStuff
'cout'不能用于处理原始二进制数据。绝对正常,他可以添加额外的'\ r'或'\ n'字符。您将文件读取为原始二进制数据,但尝试将其写入格式化的字符串数据。不奇怪,结果不匹配。尝试使用WriteFile并在这种情况下进行比较。或确定你想要什么 – RbMm