2013-07-13 4 views
-6

Не могли бы вы помочь мне найти, что такое ошибка с этой 2 строкой, которую я взял из приведенной ниже строки. Поскольку я новичок в C++, мне нужны ваши люди помощи. Кроме того, как изменить этот код на C++, потому что я привык к языку программирования Си, а неНужна помощь в коде C++

C++

fgets (линия, 80, в)

ошибка: назад (в); rows = countLines (in);

Код:

int container:: countLines(ifstream in) 
{ 
    int count = 0; 
    char line[80]; 
    if (in.good()) 
    { 
     while (!in.eof()) 
      if (in>>line) count++; 
     rewind(in); 
    } 
    return count; 
} 

// opens the file and stores the strings 
// 
// input:  string of passenger data 
//    container to store strings 
// 
int container:: processFile(char* fn) 
{ 
    char line[80]; 
    ifstream in ; 
    in.open(fn); 
    int count = 0; 
    if (!in.fail()) 
    { 
     rows = countLines(in); 
     strings = new char* [rows]; 
     while (!in.eof()) 
     { 
      if (in>>line) 
      { 
       strings[count] =new char [strlen(line)+1]; 
       strcpy(strings[count],line); 
       count++; 
      } 
     } 
    } 
    else 
    { 
     //printf("Unable to open file %s\n",fn); 
     //cout<<"Unable to open file "<<fn<<endl; 
     exit(0); 
    } 
    in.close(); 
    return count; 
} 
+0

Очевидно, что вы используете C++, потому что используете оператор пространства имен – turnt

+0

Смотрите здесь (http://en.cppreference.com/w/cpp/io/c/rewind). Rewind - это C-функция, которая работает с FILE, но вы пытаетесь перемотать поток C++. – Vincent

+2

['while (! Eof())' неверно.] (Http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – chris

ответ

2

Как правило, при передаче потока аргумент не проходит по значению:

int container:: countLines(ifstream in) 

Вы проходите по ссылке:

int container:: countLines(ifstream& in) 

Эта логика неверно:

if (in.good()) 
    { 
     while (!in.eof()) 
      if (in>>line) count++; 
    } 

Не используйте eof() таким образом. Вместо этого:

while (in >> line) 
    count++; 

Это как перемотать в C:

rewind(in); 

В C++, обратите внимание на функцию seekg: http://en.cppreference.com/w/cpp/io/basic_istream/seekg

предпочитают использовать зЬй :: строку над полукокса *:

strings = new char* [rows]; 

Опять же, не использовать EOF():

while (in >> line) 
{ 
    strings[count] =new char [strlen(line)+1]; 
    strcpy(strings[count],line); 
    count++; 
} 
+0

Спасибо, что действительно полезно. но когда я пытаюсь отказаться от eof, это дает мне ошибку, почему это происходит? Я вообще не знаю. –

+1

@PramonoWang: Поскольку вы не сказали мне, что такое ошибка, я не могу вам помочь. – Bill

+0

@PramonoWang: см. Код компиляции здесь: https://ideone.com/PZpUJe – Bill

Смежные вопросы