WriteFile()截断字符串

时间:2016-01-03 04:25:33

标签: c++ windows winapi

std::cout << buffer << std::endl;


if (lastTitle != buffer) {
    //write new title;
    WriteFile(file, "\n\nWindow: ", sizeof("\n\nWindow: "), NULL, NULL);
    WriteFile(file, buffer.c_str(), sizeof(buffer), NULL, NULL);
    WriteFile(file, "\n", sizeof("\n"), NULL, NULL);
    std::cout << GetLastError(); //this is showing 0, which means no error

Cout正在输出:

C:\用户\ riseo \桌面\ C ++ \ my_proj \调试\ my_proj.exe

正在写入的文件显示:

窗口:C:\ Users \ riseo \ Desktop \ C ++ \ m

我不太确定为什么会被截断,它应该与cout打印的相同。对不起,这篇文章没有做太多的研究,但是我整天都被各种字符串格式相关的问题所灼烧,我不知道这里发生了什么。我能想到的可能就是c_str()出错了。

1 个答案:

答案 0 :(得分:4)

你严重误导sizeof()WriteFile()对字节进行操作,但您传递的是字符数据。字符串文字包含sizeof()将包含的空终止符,在这种情况下您不需要。 std::string()包含指向字符数据的指针,因此sizeof(std::string)不会考虑真正的字符长度。

你需要这样做:

//write new title;
WriteFile(file, "\n\nWindow: ", strlen("\n\nWindow: "), NULL, NULL);
WriteFile(file, buffer.c_str(), buffer.length(), NULL, NULL);
WriteFile(file, "\n", strlen("\n"), NULL, NULL);

包装函数会更好:

bool WriteStringToFile(HANDLE hFile, const std::string &str)
{
    return WriteFile(hFile, str.c_str(), str.length(), NULL, NULL);
}

...

//write new title;
WriteStringToFile(file, "\n\nWindow: ");
WriteStringToFile(file, buffer);
WriteStringToFile(file, "\n");

std::ofstream会更好:

std::ofstream ofs("myfile.txt", std::ios_base::binary);
...
ofs << "\n\nWindow: " << buffer << "\n";