Подтвердить что ты не робот

Читать слово за словом из файла в С++

эта функция должна читать файл слово за словом и он работает до последнего слова, где выполнение останавливается

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();

    }
}

кто-нибудь видит, в чем проблема и как ее можно решить?

4b9b3361

Ответ 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"));
}