Новая строка игнорируется при использовании while l oop в C ++ - PullRequest
0 голосов
/ 24 марта 2020

ОБНОВЛЕНИЕ: я попытался добавить больше строк с двойными фидами форм, пока только последняя строка читается правильно, первые две - нет.

У меня есть программа, которая читает файл с помощью getline () и записывает номер страницы, номер строки и расположение символов каждого символа в файле. Программа записывает каждую строку в массив / вектор, как показано ниже:

array[1]: "abcdefg"
array[2]: "haha/fhahaha"
...

Индекс номера строки увеличивается по мере чтения каждой строки, используя for-l oop для извлечения своих данных.

Я использую while-l oop, чтобы определить, есть ли какие-либо символы Form Form, поэтому, когда я увеличиваю количество страниц, счетчик строк возвращается к 0, а счетчик символов возвращается к 0. При использовании while -l oop для поиска символов подачи формы ('\ f') с помощью метода find () (см. код ниже), он пропустил строку, и я не уверен, что является причиной этого.

#include <iostream>     // Basic I/O
#include <string>       // string classes
#include <fstream>      // file stream classes
#include <vector>
#include <random>
using namespace std;

int main(int argc, char* argv[]) {
    ifstream book;

    book.open("book.txt");
    vector<string> line = { "" };
    size_t pageCount = 0;
    size_t lineCount = 0;
    size_t charCount = 0;
    size_t lineNum = 0;
    while (getline(book, line[lineNum])) {

        line.push_back(line[lineNum]);
        charCount -= charCount;
        cout << "\n Line Number: " << lineNum;
        if (line[lineNum].find('\f') == string::npos) {
            //cout << "\n BEGIN OUTTER IF";
            for (size_t n = 0; n < line[lineNum].size(); ++n) {
                charCount++;
                cout << "\n !=12: Character: " << line[lineNum].at(n) << " --  Page: " << pageCount << " line: " << lineCount << " charLoc: " << n << " charCount: " << charCount - 1;
            }
        }
        else {
            size_t nPageOffset = line[lineNum].find('\f', 0);
            while (nPageOffset != string::npos)
            {
                for (size_t n = 0; n < line[lineNum].size(); ++n) {
                    if (line[lineNum].at(n) == '\f') {
                        pageCount++;
                        charCount -= charCount;
                        lineCount -= lineCount;
                        cout << "\n ==12: Character: " << line[lineNum].at(n) << " --  Page: " << pageCount << " line: " << lineCount << " charLoc: " << n << " charCount: " << charCount - 1;
                    }
                    else if (n > line[lineNum].find('\f')) {
                        charCount++;
                        cout << "\n -1 != 12: Character: " << line[lineNum].at(n) << " --  Page: " << pageCount << " line: " << lineCount << " charLoc: " << n << " charCount: " << charCount - 1;
                    }
                    else {
                        charCount++;
                        cout << "\n WE: Character: " << line[lineNum].at(n) << " --  Page: " << pageCount << " line: " << lineCount << " charLoc: " << n << " charCount: " << charCount - 1;
                    }
                }
                size_t nPageSearchOffset = nPageOffset + 1;
                nPageOffset = line[lineNum].find('\f', nPageSearchOffset);
            }
        }
        lineNum++;
        lineCount++;
    }
    book.close();
    return EXIT_SUCCESS;
}

Каждый номер строки читается, за исключением того, что пропускается номер строки: 13

Частичный вывод:

 Line Number: 12 charCount: 0
 ==12: Character:  --  Page: 6 line: 0 charLoc: 0 charCount: 4294967295
 ==12: Character:  --  Page: 7 line: 0 charLoc: 1 charCount: 4294967295
 -1 != 12: Character: g --  Page: 7 line: 0 charLoc: 2 charCount: 0
 -1 != 12: Character: h --  Page: 7 line: 0 charLoc: 3 charCount: 1
 -1 != 12: Character: i --  Page: 7 line: 0 charLoc: 4 charCount: 2
 -1 != 12: Character: g --  Page: 7 line: 0 charLoc: 5 charCount: 3
>>there supposed to be a newline after this 


 ==12: Character:  --  Page: 8 line: 0 charLoc: 0 charCount: 4294967295
 ==12: Character:  --  Page: 9 line: 0 charLoc: 1 charCount: 4294967295
 -1 != 12: Character: g --  Page: 9 line: 0 charLoc: 2 charCount: 0
 -1 != 12: Character: h --  Page: 9 line: 0 charLoc: 3 charCount: 1
 -1 != 12: Character: i --  Page: 9 line: 0 charLoc: 4 charCount: 2
 -1 != 12: Character: g --  Page: 9 line: 0 charLoc: 5 charCount: 3
 Line Number: 13 charCount: 0
 ==12: Character:  --  Page: 10 line: 0 charLoc: 0 charCount: 4294967295
 ==12: Character:  --  Page: 11 line: 0 charLoc: 1 charCount: 4294967295
 -1 != 12: Character: g --  Page: 11 line: 0 charLoc: 2 charCount: 0
 -1 != 12: Character: h --  Page: 11 line: 0 charLoc: 3 charCount: 1
 -1 != 12: Character: i --  Page: 11 line: 0 charLoc: 4 charCount: 2
 -1 != 12: Character: g --  Page: 11 line: 0 charLoc: 5 charCount: 3

Book.txt (пропустите номера строк, если вы хотите проверить и преобразовать \ f для формирования подачи ASCII 12)

Line  Content

   0  abc
   1  def\fghi
   2  abc
   3  defd\fghi
   4  ioyudef
   5  yttdef
   6  abc
   7  abci
   8  def\fghi
   9  def\fghigh
   10 \fghig
   11 hi
   12 \f\fghig
   13 \f\fghig
   14 \fghig
...