Getline в C ++, если поток вызывает нежелательное поведение? - PullRequest
1 голос
/ 16 марта 2012

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

Я получаю ошибку:

Ошибка 1 Ошибка LNK2019:неразрешенный внешний символ "public: void __thiscall ArrayStorage::read(class std::basic_ifstream<char,struct std::char_traits<char> > &)" (? read @ ArrayStorage @@ QAEXAAV? $ basic_ifstream @ DU? $ char_traits @ D @ std @@@ std @@@ Z), указанный в функции _main C: \ Users \ Lewis \ SVN \ project1 \main.obj

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

Ответы [ 3 ]

3 голосов
/ 16 марта 2012

бла-бла-бла неразрешенный внешний символ "public: void __thiscall ArrayStorage :: read (class std::basic_ifstream<char,struct std::char_traits<char> > &)" бла-бла-бла

Это ошибка компоновщика. Это означает, что определение для функции ArrayStorage::read отсутствует. Зачем? Поскольку в коде есть определение функции с именем read, а не ArrayStorage::read. Он должен найти его, если вы определите ArrayStorage::read:

//Array cpp:
void ArrayStorage::read(ifstream& fin)
// ...

Как только вы пройдете через это, программа, вероятно, сможет работать. И вы, вероятно, найдете ошибки из-за цикла чтения. while (! fin.eof() ) не «[запустить], пока файл НЕ находится в конце». Он запускается, пока предыдущая операция чтения не пыталась прочитать до конца. Подумайте, что должно было произойти к моменту проверки:

while (! fin.eof() ) // in the last iteration the read didn't go beyond the end of the file
{                    // so one more iteration is ran
    getline (fin,line); // tries to read past the end, fails

    if (line == "") continue; // line is unchanged, so it could be a non-blank line from before

    myArray[arrayIndex]=line; // Saves that line in the array:
                              // even though no line was read
    arrayIndex++;
} // goes back to the start of the loop, and only now !fin.eof() fails
  // but it's too late, the damage has been done

Вы, вероятно, не хотите, чтобы это произошло. Вы хотите остановить чтение, как только чтение не удастся. Это просто: просто поместите чтение как условие:

while (getline (fin,line)) // if reading a line fails, the loop is not entered
{                          // and so no extra line is added to the array
2 голосов
/ 16 марта 2012

Вы не предоставляете определение для функции Array::read(). Вы объявляете новую функцию с именем read(), но не относящуюся к классу Array. Компилятору и компоновщику все равно, что он находится в файле с именем Array.cpp.

Попробуйте вместо этого:

void Array::read(ifstream& fin)
{
    //...
}
0 голосов
/ 16 марта 2012

Если я помню, эта ошибка компоновщика может иногда происходить из-за того, что ваш класс или одна из его баз имеют другие виртуальные функции, которые не определены.Ошибка возникает в именованной функции, а не в виртуальной функции, в которой фактически отсутствует определение, поскольку компилятор MSVC ждет, пока не найдет первый файл CPP с определенной виртуальной функцией, чтобы класс вставил определения функций, определенных в заголовке класса, ви когда он не находит такой файл CPP, он никогда не определяет функцию, определенную заголовком класса.GCC ведет себя не так, как MSVC;Я считаю, что GCC вставляет определения в каждый объектный файл, который они используют, и отбрасывает дополнения во время ссылки.MSVC определяет его только один раз, поэтому случайно не определяет его.Причина, по которой он не может «просто знать», что «забыл» вставить определение, заключается в том, что компилятор может вызываться постепенно в любое время, только для некоторых файлов за раз, поэтому у него нет общей картины.

...