簡介:
我正在從文本文件中讀取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