как прочитать отформатированный файл на C

#c

#c

Вопрос:

У меня следующий формат. Каждая строка содержит два целых числа, а файл заканчивается на «*». Как я могу прочитать два числа из файла. Спасибо.

 4 5
7 8
78 89
 *  //end of file
  

Редактировать

Я знаю, что прочитал два числа, но не знаю, как справиться с «*». Если я сохраню каждое число как целочисленный тип и прочитаю их cin . Но последняя строка имеет строковый тип. Итак, проблема в том, что я читаю его как целое число, но это строка, я не знаю, как судить, является ли это * или нет.

Мой код был следующим (он явно неверен):

 string strLine,strChar;
istringstream istr;
int a,b;
while(getline(fin,strChar))
{
    istr.str(strLine);
    istr>> ws; 
    istr>>strChar;


    if (strChar=="*")
    {
        break;
    }
    istr>>a>>b;
}
  

Комментарии:

1. Приведенная ниже ссылка поможет вам в решении этой проблемы. cplusplus.com/reference/clibrary/cstdio/fscanf

Ответ №1:

Вы можете просто извлекать числа из ifstream объекта до тех пор, пока он не выйдет из строя.

 std::ifstream fin("file.txt");

int num1, num2;
while (fin >> num1 >> num2)
{
    // do whatever with num1 and num2
}
  

Комментарии:

1. 1 для очевидного, простого решения, которое удовлетворяет всем заявленным ограничениям OP. K.I.S.S.

Ответ №2:

Я предпочитаю использовать старый добрый метод fscanf(), см. Простой и понятный пример в MSDN.

  1. В качестве первого шага прочитайте всю строку в строковый буфер
  2. Проверьте, равно ли оно «*»
  3. Если нет — используйте sscanf() для анализа двух целых чисел

Ответ №3:

Решение состоит в том, чтобы использовать std::istream для чтения файла построчно. Затем обработайте каждую строку ввода и сохраните числа в виде списка.

 // open the file.
std::string path = "path/to/you/file";
std::ifstream file(path.c_str());
if (!file.is_open()) {
    // somehow process error.
}

// read file line by line.
std::vector< std::pair<int,int> > numbers;
for (std::string line; std::getline(file,line);)
{
    // prepare to parse line contents.
    std::istringstream parser(line);

    // stop parsing when first non-space character is '*'.
    if ((parser >> std::ws) amp;amp; (parser.peek() == '*')) {
       break;
    }

    // store numbers in list of pairs.
    int i = 0;
    int j = 0;
    if ((parser >> i) amp;amp; (parser >> j)) {
        numbers.push_back(std::make_pair(i, j));
    }
}
  

Комментарии:

1. Мое первоначальное мышление почти такое же, как и у вас, но моя проблема в том, что я не знаю peek() . Спасибо