【发布时间】:2020-07-07 22:58:18
【问题描述】:
我有以下简单的代码来读取文件:
std::basic_ifstream<wchar_t> RFile(L"C:\\file.exe", std::ios::binary|std::ios::ate);
if (!RFile.is_open()){ cout << "Cannot open the file." << endl; return 0;}
std::streamoff fileSize = RFile.tellg();
wstring fileContent;
fileContent.reserve(fileSize);
RFile.seekg(0, std::ios::beg);
if (!RFile.read(&fileContent[0], fileSize)) cout << "An error when reading the file." << endl;
RFile.close();
编译或运行时也没有出现错误,但运行时/调试时出现未知行为,程序没有结束并仍在等待(类似于等待输入)。
我的代码有问题吗?
编辑
程序终于结束并完成了它的工作,但是,我注意到:
- 该程序需要将近 32 秒才能读取 17 MB,这是正常的还是我的代码中有某些东西(我认为这很慢)?
- 另外,当使用
char数据类型而不是wchar_t时,读取过程变得应有的快,那么,wchar_t数据类型的问题还是什么?
【问题讨论】:
-
无关:在
if (!RFile.is_open()) cout << "Cannot open the file." << endl;之后,您可能不应该让程序继续运行,就像文件已打开一样。 -
它在哪里等着呢?你的调试器说什么?什么是调用堆栈?
-
调试程序时,它在哪里停止等待?通常通过检查锁定地点可以获得很好的情报。
-
tellg是否会给你wchar_ts 中的文件大小、旧字节或其他内容?了解这一点很重要。 -
可能不相关,但我认为您想要
fileContent.resize(fileSize)而不是fileContent.reserve(fileSize)。