Как eof () читает строки в файле? - PullRequest
1 голос
/ 07 апреля 2020
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    ofstream files;
    files.open("FIRST.TXT");
    string abc;
    getline(cin, abc);
    files << abc;
    files.close();
    ifstream fin;
    fin.open("FIRST.TXT");
    ofstream fout;
    fout.open("SECOND.TXT");
    char word[30];
    while (!fin.eof())
    {
        fin >> word;
        if (word[0] == 'a' || word[0] == 'e' || word[0] == 'i' || word[0] == 'o' || word[0] == 'u')
            fout << word << " ";
        cout << word << endl;
    }
    fin.close();
    fout.close();   
}

Этот код хранит слова, начинающиеся с гласных букв, в файле, отличном от файла, из которого мы читаем данные.

Как char word[30] принимает точные слова, eof() обрабатывает ли пространство пробел?

Почему l oop проверяет слова, а не символы, или проверяет первый символ после пробела, если так, почему?

1 Ответ

0 голосов
/ 07 апреля 2020

Проверка на eof в то время как l oop не работает. Вы найдете тонны страниц в SO, объясняющих это. Один пример был приведен Нейтом Элдреджем в комментарии выше: Почему iostream :: eof внутри условия al oop (то есть `while (! Stream.eof ())`) считается неправильным? .

Кроме того, я рекомендую использовать более современные элементы языка C ++. При этом вы можете избежать всех мелочей.

См. Пример ниже:

#include <iostream>
#include <sstream> 
#include <string>
#include <algorithm>
#include <iterator>

std::istringstream testFile(R"(Lorem ipsum dolor sit amet, 
consetetur sadipscing elitr, sed diam nonumy eirmod tempor 
invidunt ut labore et dolore magna aliquyam erat, sed diam 
voluptua. At vero eos et accusam et justo duo dolores et ea 
rebum. Stet clita kasd gubergren, no sea takimata sanctus est 
)");

int main() {

    std::copy_if(std::istream_iterator<std::string>(testFile),{},
        std::ostream_iterator<std::string>(std::cout, "\n"),
        [](const std::string& s) { return (0x208222 >> (s[0] & 0x1f)) & 1; });

    return 0;
}

Как видите, вся задача может быть выполнена с помощью одного оператора copy_if().

И не имеет значения, откуда поступают данные. На данный момент я использую std::istringstream. Но вы также можете открыть файл и поместить переменную std::ifstream в std::istream_iterator. То же самое с выходом. На данный момент я пишу std::cout. Здесь вы также можете поместить переменную open std::ofstream.

Итак, теперь std::copy_if(). Пожалуйста, см. Здесь для описания. copy_if() принимает 2 входных итератора для начала и конца источника, выходной итератор и условие.

istream_iterator в основном вызывает экстрактор operator>> и извлекает std::string с из потока. Он будет вызываться до тех пор, пока не будет достигнут конец файла (или не произойдет ошибка). Конечный итератор задается инициализатором по умолчанию с пустой фигурной скобкой. И если вы посмотрите здесь , вы увидите, что конструктор по умолчанию равен конечному итератору.

Для записи данных мы будем использовать std::ostream_iterator, что запишет все скопированные строки в выходной поток.

Для условия в std::copy_if() мы используем лямбду, которая проверяет, является ли первый символ строки гласным.

Алгоритм обнаружения гласного был подробно описан мной здесь .

Итак, очень просто. Необходимо только одно утверждение.

...