Я умею построчно читать текстовые файлы и сохранять их. но мой
проблема в том, как читать текстовый файл слово за словом.
У меня есть текстовый файл:
1-Reserved-2018-12-23-Lecture Room-13
2-Reserved-2018-11-34-Tutorial Room-15
3-Not Reserved-0-0-0-Design Studio-18
4-Reserved-2018-11-16-Lecture Room-14
5-Not Reserved-0-0-0-Exam Hall-18
Продолжая мой комментарий выше, всякий раз, когда вы сталкиваетесь с разделением слов в строке с разделителем между словами, стандартным подходом является каждая строка в string
с getline
, а затем создайте stringstream
из строки, читающей каждое слово в string
, используя getline
с указанным разделителем.
Зачем читать строку с getline
и читать stringstream
с getline
снова?
Ответ: line-control.
В то время как вы могли бы просто читать непосредственно из вашего файла, используя getline
и разделитель, который будет разделять каждое слово, как бы вы узнали, когда заканчивается одна строка, а начинается следующая? Когда вы задаете разделитель для использования с getline
, getline
будет читать до тех пор, пока не будет найден разделитель или пока не будет прочитан конец ввода или str.max_size
символов. См. cppreference.com - std :: getline . Таким образом, в этом случае нет особого значения для окончания строки '\n'
.
Однако, если вы прочитаете всю строку в string
, а затем создадите stringstream
из строки, вы знаете, что можете читать только до конца строки, так как это вызовет конец файла условие на входе. Таким образом, даже если вы используете getline
с разделителем, теперь он может читать только до конца строки.
Короткий пример использования этого подхода и использования вашего файла данных покажет, как вы можете разделить каждую строку на слова, которые затем можете добавить к каждому узлу вашего списка, например,
#include <iostream>
#include <fstream>
#include <sstream>
#include <string>
int main (int argc, char **argv) {
std::string line; /* string to hold each line */
if (argc < 2) { /* validate at least 1 argument given */
std::cerr << "error: insufficient input.\n"
"usage: " << argv[0] << " filename\n";
return 1;
}
std::ifstream f (argv[1]); /* open file */
if (!f.is_open()) { /* validate file open for reading */
perror (("error opening file " + std::string(argv[1])).c_str());
return 1;
}
while (getline (f, line)) { /* read each line into line */
std::string word; /* string to hold words */
std::stringstream s (line); /* create stringstream from line */
while (getline (s, word, '-')) /* read hyphen separated words */
std::cout << word << '\n'; /* output words */
std::cout << '\n'; /* tidy up with newline between data */
}
}
Пример входного файла
$ cat ../dat/hyphenstr.txt
1-Reserved-2018-12-23-Lecture Room-13
2-Reserved-2018-11-34-Tutorial Room-15
3-Not Reserved-0-0-0-Design Studio-18
4-Reserved-2018-11-16-Lecture Room-14
5-Not Reserved-0-0-0-Exam Hall-18
Пример использования / Вывод
Обратите внимание, код выше просто выводит дополнительный '\n'
между словами, отделенными от каждой строки. Вы должны написать логику (возможно, с использованием счетчика и, например, stoi
для любых необходимых преобразований), чтобы преобразовать значения в целочисленные значения и сохранить каждое в соответствующем поле.
$ ./bin/getline_hyphen ../dat/hyphenstr.txt
1
Reserved
2018
12
23
Lecture Room
13
2
Reserved
2018
11
34
Tutorial Room
15
3
Not Reserved
0
0
0
Design Studio
18
4
Reserved
2018
11
16
Lecture Room
14
5
Not Reserved
0
0
0
Exam Hall
18
Вы также можете удалить разделители из каждой строки, создать отдельный stringstream
без дефисов и использовать >>
для чтения и преобразования значений для каждого узла. (этот второй подход оставлен вам)
Посмотрите вещи и дайте мне знать, если у вас есть дополнительные вопросы.