Хотя я не удовлетворяю ваш вопрос напрямую, я привел пример точек чтения, используя struct
, std::istream
и std::vector
. Они предпочтительнее, чем fscanf
и массивы.
struct Point
{
unsigned int x;
unsigned int y;
friend std::istream& operator>>(std::istream& inp, Point& p);
};
std::istream& operator>>(std::istream& inp, Point& p)
{
inp >> p.x;
//Insert code here to read the separator character(s)
inp >> p.y;
return inp;
}
void Read_Points(std::istream& input, std::vector<Point>& container)
{
// Ignore the first line.
inp.ignore(1024, '\n');
// Read in the points
Point p;
while (inp >> p)
{
container.push_back(p);
}
return;
}
Структура Point
обеспечивает большую читабельность и, IMHO, большую универсальность, поскольку вы можете объявлять другие классы, используя Point
:
class Line
{
Point start;
Point end;
};
class Rectangle
{
Point upper_left_corner;
Point lower_right_corner;
friend std::istream& operator>>(std::istream& inp, Rectangle& r);
};
Вы можете добавить методы для чтения из файла, используя operator>>
для точки:
std::istream& operator>> (std::istream& input, Rectangle& r)
{
inp >> r.upper_left_corner;
//Insert code here to read the separator character(s)
inp >> r.lower_left_corner;
return inp;
}
Массивы являются проблемой и могут привести к неприятным ошибкам во время выполнения, таким как переполнение буфера. Перенесите std::vector
, классы или структуры в массивы.
Кроме того, поскольку используется std::istream
, эти структуры и классы можно легко использовать с std::cin
и файлами (std::ifstream
):
// Input from console
Rectangle r;
std::cin >> r;