std::wifstream theFileHandle;
std::wstring theData;
theFileHandle.open( theFile.Name() );
theFileHandle >> theData;
theFileHandle.close();
有谁能告诉我为什么我的字符串(theData)只从文件中获取第一个单词(theFile)???我希望字符串包含文件中的所有文本,包括空格和新行,是否有人对此有建议?谢谢。
PS。我需要完美保存数据。感谢。
答案 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,以便在整个文件中简明扼要地阅读,并有效地进行阅读。