Каким образом можно пропускать строки и символы при чтении данных из файла?

Я изучаю C++ и работаю с перегрузкой операторов. В процессе возникла ошибка, которую я понимаю, но не знаю, как исправить. Мне нужно, чтобы данные записывались в файл в исходном формате, но при чтении из файла нужно игнорировать все строки и символы, оставляя только цифры. Проект состоит из одного заголовочного файла и двух файлов .cpp: 

//Point.h 
#pragma once 
#include ... 

using namespace std; 

class Point { 
private: 
    int x = 0; 
    int y = 0; 
public: 
    Point() {}; 
    Point(int x, int y); 
    Point(Point& Class); 
    ~Point(); 

    bool operator==(Point& other); 
    friend ostream& operator<<(ostream& output, Point& other); 
    friend istream& operator>>(istream& input, Point& other); 
}; 

//PointLogic.cpp 
#include "Point.h" 
Point::Point(int x, int y) { 
    this->x = x; 
    this->y = y; 
} 
Point::~Point() { } 

bool Point::operator==(Point& other) { 
    return this->x == other.x && this->y == other.y; 
} 

ostream& operator<<(ostream& output, Point& other) { 
    output << "Точка в координате X = " << other.x << endl; 
    output << "Точка в координате Y = " << other.y << endl; 
    return output; 
} 

istream& operator>>(istream& input, Point& other) { 
    input >> other.x >> other.y; 
    return input; 
} 

// AMC.cpp / main.cpp 
#include "Point.h" 

int main() { 
    setlocale(LC_ALL, "Rus"); 
    Point a(2, 22); 
    Point b(2, 14214); 
    cout << b; 

    ofstream file("File.txt"); 
    file << a; 
    file.close(); 
    ... 
  • 19 марта 2025 г. 20:04
Ответы на вопрос 1
Чтобы пропускать строки и символы при чтении данных из файла, вы можете модифицировать перегрузку оператора `>>` для класса `Point`, чтобы она игнорировала все нечисловые символы и строки. Для этого можно использовать стандартные функции, такие как `isdigit` для проверки, если символ является цифрой, и применять циклы для пропуска нежелательных данных.

Ниже приведен пример реализации этого подхода:

### Изменения в файле `PointLogic.cpp`

```cpp
#include "Point.h"
#include <cctype> // Для isdigit

Point::Point(int x, int y) {
    this->x = x;
    this->y = y;
}

Point::~Point() { }

bool Point::operator==(Point& other) {
    return this->x == other.x && this->y == other.y;
}

ostream& operator<<(ostream& output, Point& other) {
    output << "Точка в координате X = " << other.x << endl;
    output << "Точка в координате Y = " << other.y << endl;
    return output;
}

istream& operator>>(istream& input, Point& other) {
    string buffer;
    char ch;

    int values[2];
    int index = 0;

    // Читаем всё до конца потока
    while (input >> ch) {
        if (isdigit(ch) || ch == '-') { // Учитываем знаки минус на случай отрицательных чисел
            buffer += ch;
        } else if (!buffer.empty()) { // Если buffer не пустой, конвертируем его в число
            values[index++] = stoi(buffer);
            buffer.clear();
            if (index >= 2) break; // Мы прочитали 2 значения, выходим
        }
    }

    if (index >= 1) other.x = values[0];
    if (index >= 2) other.y = values[1];

    return input;
}
```

### Объяснение изменений:
1. **Цикл чтения символов**: Вместо того чтобы пытаться сразу прочитать `int` из потока, мы читаем каждый символ по отдельности. Если символ является цифрой или знаком `-`, мы добавляем его в `buffer`.
2. **Конвертация в целое число**: Когда встречаем символ, который не является частью числа (например, пробел или конец строки), и если `buffer` содержит какое-то значение, мы преобразуем его в целое число и сохраняем в массив.
3. **Условия на количество считанных значений**: Мы ограничиваем считывание только первыми двумя числовыми значениями и при необходимости можем выбросить остальные символы.
   
### Пример использования:
Когда вы будете использовать ваш класс `Point` и считывать данные, например как-то так:

```cpp
ifstream file("File.txt");
Point c;
file >> c; // Считывание точки, игнорируя все ненужные символы
cout << c; // Выводим считанные координаты
```

Таким образом, если файл содержит строки, которые не представляют собой координаты, они будут пропущены, и только числовые значения будут считаны в ваш объект `Point`.
Похожие вопросы