#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.
- В качестве первого шага прочитайте всю строку в строковый буфер
- Проверьте, равно ли оно «*»
- Если нет — используйте 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()
. Спасибо