为什么不是>>正常工作C ++?

时间:2011-02-10 00:56:29

标签: c++

std::wifstream theFileHandle;
std::wstring theData;
theFileHandle.open( theFile.Name() );
theFileHandle >> theData;
theFileHandle.close();

有谁能告诉我为什么我的字符串(theData)只从文件中获取第一个单词(theFile)???我希望字符串包含文件中的所有文本,包括空格和新行,是否有人对此有建议?谢谢。

PS。我需要完美保存数据。感谢。

4 个答案:

答案 0 :(得分:4)

你只得到第一个单词的原因是这正​​是>>运算符在应用于字符串时的工作原理 - 它只是从你正在读取的任何流中获取第一个以空格分隔的标记,跳过任何前导空格后。

如果您想阅读文件的全部内容,可以使用getline这样的功能:

std::wifstream theFileHandle;
theFileHandle.open( theFile.Name() );

std::wstringstream data;
for (std::wstring line; getline(theFileHandle, line); )
    data << line << L"\n";

std::wstring theData = data.str();

循环,同时可以通过getline读取更多数据,从而从文件中提取所有数据。由于getline跳过换行符,因此这种方法也会重新添加新行。

编辑:正如@PigBen指出的那样,使用rdbuf()可以更清晰地实现此目的:

std::wifstream theFileHandle;
theFileHandle.open( theFile.Name() );

std::wstringstream data;
data << theFileHandle.rdbuf();

std::wstring theData = data.str();

这使用了流插入运算符重载以接收流缓冲区的事实。在这种情况下的行为是读取流缓冲区的全部内容,直到所有数据都已用尽,这正是您想要的行为。

答案 1 :(得分:3)

对于字符串,

operator>>的定义与%s的{​​{1}}转换几乎相同,scanf仅在遇到空格时才会读取。

有很多方法可以将整个文件读入字符串。最简单的可能是:

std::wstringstream buffer;
buffer << theFileHandle.rdbuf();
theData = buffer.str();

如果你正在处理一个大文件,那么至少有一种方法显然更快。请参阅我之前发布的答案中的Test Four(但该代码是Martin York的,而不是我的。)

答案 2 :(得分:1)

>>应该如何运作。它从输入流中提取格式化数据。您希望.read()提取未格式化的数据。

在此处查看更多内容:http://www.cplusplus.com/reference/iostream/istream/read/

e.g:

std::wifstream theFileHandle;
wchar_t theData[SOME_LARGE_VALUE];
theFileHandle.open( theFile.Name() );
theFileHandle.read(theData, sizeof(theData));
theFileHandle.close();

答案 3 :(得分:1)

请参阅优秀的previous answer,以便在整个文件中简明扼要地阅读,并有效地进行阅读。