Проблемы с использованием getline () - PullRequest
2 голосов
/ 27 января 2012

У меня кончились волосы, чтобы вытащить, поэтому я подумала, что кто-то здесь может мне помочь с этим разочарованием.

Я пытаюсь прочитать файл построчно, что кажется довольно простым, используя getline (). Проблема в том, что мой код, похоже, продолжает игнорировать \ n и помещает весь файл в одну строку, что, по меньшей мере, проблематично.

void MakeRandomLayout(int rows, int cols)
{
    string fiveByFive = "cubes25.txt";
    string fourByFour = "cubes16.txt";

    ifstream infile;

    while (true) {
        infile.open(fourByFour.c_str());
        if (infile.fail()) {
            infile.clear();
            cout << "No such file found";
        } else {
            break;
        }
    }

    Vector<string> cubes;
    string cube;
    while (std::getline(infile, cube)) {
        cubes.add(cube);
    }
}

Редактирует: Запуск OSX 10.7. Бесконечный цикл для файла не завершен, в конечном итоге будет запрашивать файл. Не повезло с расширенной версией getline (), пробовал ранее. Та же система для разработки и сборки / запуска.

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

AAEEGN
ABBJOO
ACHOPS
AFFKPS
AOOTTW
CIMOTU
DEILRX
DELRVY
DISTTY
EEGHNW
EEINSU
EHRTVW
EIOSST
ELRTTY
HIMNQU
HLNNRZ

Каждая строка находится на новой строке в файле. Второй, который я не читаю, тот же, но 25 строк вместо 16

Ответы [ 2 ]

1 голос
/ 27 января 2012

Программное обеспечение Mac распознает либо '\r', либо '\n' как окончания строк для обратной совместимости с Mac OS Classic. Убедитесь, что ваш текстовый редактор не поместил '\r' окончания строк в ваш файл, когда код обработки ожидает '\n' (и убедитесь, что символы '\n', которые, по вашему мнению, находятся в середине строки, на самом деле не являются '\r' вместо.

1 голос
/ 27 января 2012

Я подозреваю, что вам не удается правильно отобразить содержимое Vector. Когда вы выбрасываете Vector, вы печатаете \n после каждой записи? Вы должны это сделать, потому что getline отбрасывает символы новой строки при вводе.

К вашему сведению: типичный шаблон для построчного чтения следующий:

Vector<string> cubes;
string cube;
while(std::getline(infile, cube)) {
  cubes.add(cube);
}

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

<час /> РЕДАКТИРОВАТЬ: Для чего бы это ни стоило, если бы вы использовали std::vector, вы могли бы залить файл таким образом:

std::ifstream ifile(av[1]);
std::vector<std::string> v(
  (std::istream_iterator<std::string>(ifile)),
  std::istream_iterator<std::string>());
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...