2015-09-11 2 views
1

Я хотел найти количество строк в текстовом файле, но я не смог прочитать содержимое после выполнения istreambuf_iterator.Не удалось прочитать файл после «istreambuf_iterator»

std::ifstream loadfile("file.txt"); 
line_count = std::count(std::istreambuf_iterator<char>(loadfile), std::istreambuf_iterator<char>(), '\n'); 
double val; 
loadfile >> val ; 

Что я сделал не так?

ответ

2

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

loadfile.seekg(0, std::ios::beg); 

Это немного необычно, чтобы сделать перекличку линии, как это и затем вернуться, чтобы прочитать данные, так как он не может быть переведены в общий поток (например, если ваша программа должна была получать данные на стандартном вводе). При синтаксическом анализе на основе строки обычно используется следующий шаблон:

int line_count = 0; 
for(std::string line; std::getline(loadfile, line);) 
{ 
    ++line_count; 
    std::istringstream iss(line); 

    // Read values on current line from 'iss'. 
} 

// Now that you're finished, you have a line count. 
+0

Я пытаюсь прочитать данные в вектор, поэтому я думаю об инициализации вектора с количеством данных/строк. – askingtoomuch

+1

Ну, вектор _will_ будет расти, когда вы используете 'push_back'. Вам не нужно строго устанавливать его на этот размер, если только у вас нет особых причин сделать это для абсолютно необходимой оптимизации. Имейте в виду, что стоимость динамического изменения размера вектора значительно меньше стоимости чтения файла в два раза. – paddy