Вам придется отказаться от чтения в string
с, потому что operator >>(istream&, string&)
отбрасывает пробел и содержимое пробела (== '\n'
или != '\n'
, то есть вопрос ...) это то, что даст вам номера строк.
Здесь ООП может спасти день. Вам нужно написать класс, который будет выступать в качестве «внешнего интерфейса» для чтения из файла. Его работа будет состоять в том, чтобы буферизовать данные из файла и возвращать слова по одному для вызывающей стороны.
Внутри класса класс должен читать данные из файла блоком (скажем, 4096 байт) за раз. Тогда метод string GetWord()
(да, возвращение по значению здесь хорошо) будет:
- Сначала прочитайте все пробельные символы, стараясь увеличивать элемент
lineNumber
объекта каждый раз, когда он попадает в \n
.
- Затем прочитайте непробельные символы, поместив их в объект
string
, который вы будете возвращать.
- Если не хватает материалов для чтения, прочитайте следующий блок и продолжайте.
- Если вы нажмете конец файла, то у вас будет
string
- целое слово (которое может быть пустым), и его следует вернуть.
- Если функция возвращает пустую строку, это говорит вызывающей стороне, что конец файла достигнут. (Файлы обычно заканчиваются пробельными символами, поэтому чтение пробельных символов не может означать, что слово будет позже.)
Затем вы можете вызвать этот метод в том же месте в вашем коде, что и строка cin >>
, и остальной код не должен знать детали буферизации вашего блока.
Альтернативный подход заключается в чтении строк по очереди, но все функции чтения, которые будут работать для вас, требуют, чтобы вы создали буфер фиксированного размера для предварительного чтения, и если строка длиннее, чем этот буфер, Вы должны как-то с этим справиться. Это может быть сложнее, чем класс, который я описал.