此函数应逐字读取文件 它确实有效,直到最后一个字,运行停止
void readFile( )
{
ifstream file;
file.open ("program.txt");
string word;
char x ;
word.clear();
while ( ! file.eof() )
{
x = file.get();
while ( x != ' ' )
{
word = word + x;
x = file.get();
}
cout<< word <<endl;
word.clear();
}
}
任何人都能看出问题是什么以及如何解决?
答案 0 :(得分:42)
首先,不要循环while (!eof())
,它将无法按预期工作,因为{<1}}将在在读取失败后才会设置到文件结束。
其次,普通输入操作符eofbit
在空格上分隔,因此可用于读取“单词”:
>>
答案 1 :(得分:9)
我已经为你编辑了这个功能,
void readFile()
{
ifstream file;
file.open ("program.txt");
if (!file.is_open()) return;
string word;
while (file >> word)
{
cout<< word << '\n';
}
}
答案 2 :(得分:2)
你在这里做的是从输入流一次读取一个字符,并假设所有字符在&#34;之间。 &#34;代表一个词。但它不太可能成为&#34; &#34;在最后一个字之后,这可能是它不起作用的原因:
"word1 word2 word2EOF"
答案 3 :(得分:2)
如果可以,我可以为您提供相同任务的新代码,在我的代码中,您可以创建一个所谓的&#39;文档&#39;(不是真的)并保存,并且可以再次打开。它也存储为字符串文件(不是文档)。 这是代码:
#include "iostream"
#include "windows.h"
#include "string"
#include "fstream"
using namespace std;
int main() {
string saveload;
cout << "---------------------------" << endl;
cout << "|enter 'text' to write your document |" << endl;
cout << "|enter 'open file' to open the document |" << endl;
cout << "----------------------------------------" << endl;
while (true){
getline(cin, saveload);
if (saveload == "open file"){
string filenamet;
cout << "file name? " << endl;
getline(cin, filenamet, '*');
ifstream loadFile;
loadFile.open(filenamet, ifstream::in);
cout << "the text you entered was: ";
while (loadFile.good()){
cout << (char)loadFile.get();
Sleep(100);
}
cout << "" << endl;
loadFile.close();
}
if (saveload == "text") {
string filename;
cout << "file name: " << endl;
getline(cin, filename,'*');
string textToSave;
cout << "Enter your text: " << endl;
getline(cin, textToSave,'*');
ofstream saveFile(filename);
saveFile << textToSave;
saveFile.close();
}
}
return 0;
}
只需使用此代码并进行更改即可达到您的目的。 梦想大,想大,做大事
答案 4 :(得分:1)
正如其他人所说的那样,您可能只是在阅读文件的末尾,因为您只是在检查x != ' '
。相反,你还必须在内部循环中检查EOF(但在这种情况下不要使用char,而是使用足够大的类型):
while ( ! file.eof() )
{
std::ifstream::int_type x = file.get();
while ( x != ' ' && x != std::ifstream::traits_type::eof() )
{
word += static_cast<char>(x);
x = file.get();
}
std::cout << word << '\n';
word.clear();
}
但话又说回来,你可以使用流的流媒体运营商,这些运营商已经在空白处分开(并且更好地考虑了多个空格和其他类型的白色空间):
void readFile( )
{
std::ifstream file("program.txt");
for(std::string word; file >> word; )
std::cout << word << '\n';
}
更进一步,您可以使用标准算法完全摆脱手动循环:
#include <algorithm>
#include <iterator>
void readFile( )
{
std::ifstream file("program.txt");
std::copy(std::istream_iterator<std::string>(file),
std::istream_itetator<std::string>(),
std::ostream_iterator<std::string>(std::cout, "\n"));
}