Читать слово за словом из файла в С++
эта функция должна читать файл слово за словом
и он работает до последнего слова, где выполнение останавливается
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();
}
}
кто-нибудь видит, в чем проблема и как ее можно решить?
Ответы
Ответ 1
Прежде всего, не зацикливайте while (!eof())
, он не будет работать так, как вы ожидаете, потому что eofbit
не будет установлен до тех пор, пока после неудачного чтения из-за конца файла.
Во-вторых, обычный оператор ввода >>
разделяется на пробелы и поэтому может использоваться для чтения "слов":
std::string word;
while (file >> word)
{
...
}
Ответ 2
Я отредактировал эту функцию для вас,
void readFile()
{
ifstream file;
file.open ("program.txt");
if (!file.is_open()) return;
string word;
while (file >> word)
{
cout<< word << '\n';
}
}
Ответ 3
то, что вы здесь делаете, это чтение одного символа за раз из входного потока и предположить, что все символы между "представляют слово. НО это вряд ли будет" после последнего слова", поэтому, вероятно, почему это не работает:
"word1 word2 word2EOF"
Ответ 4
Если бы я мог дать вам новый код для одной и той же задачи, в моем коде вы можете создать так называемый "документ" (не реально), и он будет сохранен и может быть снова открыт. Он также сохраняется как строковый файл (не документ).
Вот код:
#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;
}
Просто возьмите этот код и измените его, чтобы служить вашей цели.
DREAM BIG, ДУМАЙТЕ БОЛЬШОЙ, БОЛЬШОЙ
Ответ 5
Как говорили другие, вы, вероятно, читаете конец файла, поскольку вы проверяете только 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"));
}