чтение разделенного пробела числа из файла до символа новой строки - PullRequest
4 голосов
/ 10 октября 2011

У меня есть текстовый файл, который содержит следующие данные.

Первая строка такова:

5 4 3 2 1

Вторая строка такова:

1 2 3 4 5

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

void polynomial::allocate_poly(std::ifstream& in, const char* file, const char* number)
{

    in.open(file);

    std::string str;
    char b;
    int m = 0;

    for(int i = 0; !in.eof(); ++i)
    {
        in >> b;
        m = b - '0';
        a.insert(m);
    }

С этим подходом связано несколько проблем.Я пробовал разные двоичные операторы в цикле for, такие как b == '\n', и ни один из них, похоже, не сработал, когда b - символ новой строки.

Также выделение номеров из файла таким образом, что это выглядит как 5 5 4 3 2 1 1 2 3 4 5, поэтому кажется, что где-то копируется лишняя 5, я не уверен, является ли это битом eof.

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

У меня вопрос: как я могу выделить числа в первой строке до символа новой строки, а затем передать переменную ifstream in другому объекту для выделения второй строки?Спасибо за вашу помощь.

1 Ответ

10 голосов
/ 10 октября 2011

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

Вот типичный концерт:

#include <sstream>
#include <fstream>
#include <string>

std::string line;
std::ifstream infile("myfile.txt");

while (std::getline(infile, line))  // this does the checking!
{
  std::istringstream iss(line);
  char c;

  while (iss >> c)
  {
    int value = c - '0';
    // process value
  }
}

Однако это преобразование из char в int является громоздкими хрупкий.Почему бы не прочитать целое число напрямую?

  int value;
  while (iss >> value) { /* ... */ }

Редактировать: Основываясь на вашем комментарии, вот код для чтения ровно двух строк:

std::string line;
int val;

if (std::getline(infile, line))
{
  std::istringstream iss(line);
  while (iss >> value) { /* process first line */ }
}
if (std::getline(infile, line))
{
  std::istringstream iss(line);
  while (iss >> value) { /* process second line */ }
}
...