Как я могу игнорировать конец строки или символ новой строки при чтении текстовых файлов слово за словом?

Задача:

Я читаю текстовый файл слово за словом и сохраняю каждое слово как элемент массива. Затем я распечатываю этот массив слово за словом. Я знаю, что это можно было бы сделать более эффективно, но это для задания, и я должен использовать массив.

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

Текущая ситуация:

У меня есть текстовый файл, который выглядит так:

beginning of file




more lines with some bizzare     spacing
some lines next to each other
while

others are farther apart
eof

Вот часть моего кода с itemsInArray, инициализированным в 0, и массивом слов, обозначаемым как wordArray[ (approriate length for my file ) ]:


ifstream infile;
infile.open(fileExample);

while (!infile.eof()) {

    string temp;
    getline(infile,temp,' ');  // Successfully reads words seperated by a single space
    
    
    if ((temp != "") && (temp != '\n') && (temp != " ") && (temp != "\n") && (temp != "\0") {
            wordArray[itemsInArray] = temp;
            itemsInArray++;
    }

Проблема:

Мой код сохраняет символ конца строки как элемент в моем массиве. В моем выражении if я перечислил все способы, которыми я пытался скрыть символ конца строки, но мне не повезло.

Как я могу предотвратить сохранение символа конца строки как элемента в моем массиве?

Я пробовал несколько других методов, которые я нашел в потоках, подобных этому, в том числе что-то с *const char, которое я не мог заставить работать, а также повторение и удаление новых символов строки. Я работаю над этим часами, я не хочу повторно публиковать ту же проблему и пробовал много разных методов.


person wrightMatthew    schedule 01.02.2015    source источник
comment
На данный момент мой файл .txt содержит целую книгу без заглавных букв. Есть несколько возвратов или новых строк в отдельные главы. Я уже обошел сохранение лишних пробелов в качестве элементов в моем массиве, я только изо всех сил пытаюсь не сохранить символы новой строки. Еще раз спасибо.   -  person wrightMatthew    schedule 01.02.2015
comment
Связано: stackoverflow.com/q/5605125/78845   -  person Johnsyweb    schedule 01.02.2015


Ответы (3)


Стандартный оператор >>, перегруженный для std::string, уже использует пробел в качестве границы слова, поэтому вашу программу можно значительно упростить.

#include <iostream>
#include <string>
#include <vector>

int
main()
{
  std::vector<std::string> words {};
  {
    std::string tmp {};
    while (std::cin >> tmp)
      words.push_back(tmp);
  }
  for (const auto& word : words)
    std::cout << "'" << word << "'" << std::endl;
}

Для ввода, который вы показываете, это выведет:

'beginning'
'of'
'file'
'more'
'lines'
'with'
'some'
'bizzare'
'spacing'
'some'
'lines'
'next'
'to'
'each'
'other'
'while'
'others'
'are'
'farther'
'apart'
'eof'

Разве это не то, что вы хотите?

person 5gon12eder    schedule 01.02.2015

Оператор извлечения потока должен позаботиться об этом за вас.

std::ifstream ifs("file.txt");
while (ifs.good())
{
    std::string word;
    ifs >> word;
    if (ifs.eof())
    {
        break;
    }

    std::cout << word << "\n";
}
person James Adkison    schedule 01.02.2015
comment
Большое спасибо. Это помогло. Я новичок в кодировании и не знал о функции разрыва. Проблема, с которой я сталкивался, заключалась в том, что иногда возврат (новая строка) или несколько возвратов читались как отдельная строка. - person wrightMatthew; 02.02.2015

person    schedule
comment
это только для избегания пробелов. - person Akshay Garje; 12.04.2016