0 / 0 / 0
Регистрация: 24.09.2017
Сообщений: 28
1

Считывание структурированного файла

21.10.2017, 20:59. Показов 1278. Ответов 7

Здравствуйте, написал программу с помощью которой должны считываться данные типа Reading из файла mydata.txt в вектор mod_points; Но на выводе получается
C++
1
2
3
4
5
6
7
8
9
(0,0)
, (0,0)
, (0,0)
, (0,0)
, (0,0)
, (0,0)
, (0,0)
 
Please enter a character to exit
Пожалуйста помогите разобраться со считыванием.
Вот код программы

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#include <c:\Users\bonda\Documents\Visual Studio 2017\Projects\std_lib_facilities.h>
#include <Windows.h>
class Point {
public:
    int x;
    int y;
};
istream& operator >> (istream&is, Point&pp) {
    int x, y;
    is >> x >> y;
    if (!is) return is;
    pp.x = x;
    pp.y = y;
    return is;
}
ostream&operator<<(ostream&os, Point&pp) {
    return os << '(' << pp.x << ',' << pp.y << ')'<<endl;
}
class Reading {
public:
    Point rtop(Reading& r) {
        Point pp;
        pp.x = r.x;
        pp.y = r.y;
        return pp;
    }
    Reading();
    int x;
    int y;
};
istream&operator>>(istream&is, Reading r) {
    char ch1, ch2, ch3;
    int x, y;
    is >> ch1 >> x >> ch2 >> y >> ch3;
    if (!is) return is;
    if (ch1 != '(') {
        is.unget();
        is.clear(ios_base::failbit);
        return is;
    }
    if (ch2 != ',' || ch3 != ')') throw exception("Invalid sign!");
    r.x = x;
    r.y = y;
    return is;
}
Reading::Reading()
    :x{0},y{0}{
}
ostream&operator<<(ostream&os, Reading&pp) {
    return os << '(' << pp.x << ',' << pp.y << ')' << endl;
}
int main() try {
    SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
    SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
    /*vector<Point> original_points;
    Point p;
    cout << "Введите координаты 7 пар: ";
    for (int i = 0; i < 7; ++i) {
        cin >> p;
        original_points.push_back(p);
    }
    ofstream ost{ "C:/Users/bonda/Documents/Visual Studio 2017/Projects/Упражнение/Files/mydata.txt" };
    for (int i = 0; i < original_points.size(); ++i) {
            ost <<original_points[i];
    }
    ost.close();*/
    ifstream ist{ "C:/Users/bonda/Documents/Visual Studio 2017/Projects/Упражнение/Files/mydata.txt" };
    ist.exceptions(ist.exceptions() | ios_base::badbit);
    Point mp;
    vector<Reading> mod_points;
    while (true) {
        Reading buff;
        if (!(ist >> buff)) break;
        mod_points.push_back(buff);
 
    }
    for (int i = 0; i < mod_points.size(); ++i) {
        if (i != 6)
            cout << ' ' << mod_points[i] << ',';
        else
            cout << ' ' << mod_points[i] << endl;
    }
    keep_window_open();
}
catch (exception&e) {
    cerr << e.what();
    keep_window_open();
}
__________________
Помощь в написании контрольных, курсовых и дипломных работ, диссертаций здесь
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.10.2017, 20:59
Ответы с готовыми решениями:

Вывод данных из структурированного файла
помогите как вывести данные из файла в таблицу следующим образом strana | stolica | valuta...

Как удалить строку из структурированного .txt файла
Слышал что можно пересоздать файл но без строки..но как? как указать что именно N строка мне не...

Ошибка инициализации переменной при чтении структурированного файла
Почему выдаёт ошибку: &quot;Использована неинициализированная локальная переменная &quot;rr&quot;.&quot; При таком же...

Заменить считывание с клавиатуры на считывание из файла
Помогите пожалуйста, ни разу не работал со считыванием из файла поэтому не понимаю как и что...

7
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
21.10.2017, 21:17 2
вероятно все это можно было сделать через pair, зачем вам ещё 1 клас оберта типа Reading? Какие ф-и он исполняет?
зачем здесь try/throw/catch? что вы сдесь такого отлавливаете? -я считаю достаточно обычного обработки и без них(хотя может чего и не шарю).
Цитата Сообщение от valeron181100 Посмотреть сообщение
C++
1
2
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
* * SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
Зачем?
каким образом у вас структуирован файл? вам нужно просто вывести содержимое? тогда проще работать со строками
0
0 / 0 / 0
Регистрация: 24.09.2017
Сообщений: 28
21.10.2017, 21:41  [ТС] 3
Цитата Сообщение от Azazel-San Посмотреть сообщение
зачем вам ещё 1 клас оберта типа Reading? Какие ф-и он исполняет?
В учебнике Страуструпа он через отдельный класс считывает данные из файла
Цитата Сообщение от Azazel-San Посмотреть сообщение
1
2
SetConsoleCP(1251);// установка кодовой страницы win-cp 1251 в поток ввода
* * SetConsoleOutputCP(1251); // установка кодовой страницы win-cp 1251 в поток вывода
Эти строки нужны для правильного ввода и вывода русского текста
Цитата Сообщение от Azazel-San Посмотреть сообщение
вам нужно просто вывести содержимое? тогда проще работать со строками
Да, можно, таким образом я просто обойду метод считывания данных с фала с помощью класса стороной. А я хочу понять все пути.
Цитата Сообщение от Azazel-San Посмотреть сообщение
вероятно все это можно было сделать через pair,
А об этом можно поподробнее?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
21.10.2017, 22:11 4
Цитата Сообщение от valeron181100 Посмотреть сообщение
Эти строки нужны для правильного ввода и вывода русского текста
но у вас на русском ничего не выводит.. разве в файле что-то есть?
Цитата Сообщение от valeron181100 Посмотреть сообщение
А об этом можно поподробнее?
можно, к примеру у меня есть файл, с координатами точек в виде fx(x, y), и я их хочу считать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <string>
#include <vector>
#include <fstream>
using namespace std;
 
int main()
{
    ifstream fin("data.txt"); // мой файл
    pair<int, int> p; // вместо struct Record { int x, int y; }
    vector<pair<int, int>> v; // вектор пар
    while (fin >> p.first >> p.second) { // считываем данные в нашу пару
        v.push_back(p); // затем в наш вектор
    }
    fin.close(); // закрываем что бы не повредить чего)
 
    for (auto &i : v) { // вывод
        print(i);
    }
    return 0;
}
вот что выводит:
[5,-5]
[4,-4]
[2,-2]
[1,-1]
[9,-9]
Для продолжения нажмите любую клавишу . . .

все верно, не обращайте внимание на [] в выводе, это у меня вывод просто свой прописан для пары

Добавлено через 15 минут
C++
1
2
3
    for (auto &i : v) {
        cout << get<0>(i) << ", " << get<1>(i) << endl;
    }
вот, верный вывод
1
0 / 0 / 0
Регистрация: 24.09.2017
Сообщений: 28
22.10.2017, 00:04  [ТС] 5
Спасибо а можете ещё рассказать что значит эта запись
C++
1
get<0>(i)
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
22.10.2017, 00:31 6
Лучший ответ Сообщение было отмечено valeron181100 как решение

Решение

valeron181100, эта функция возвращает 1 элемент нашей пары, в <> указывается id т.е. 1 или 2 элемент, а в () сам объект пары, это как у нас была бы структура и были бы функции для вывода х и у, что-то типо getX, getY

Добавлено через 2 минуты
C++
1
2
pair<int, int> p(6, 9);
cout << get<0>(p); // выводим 1 элемент пары р
1
0 / 0 / 0
Регистрация: 24.09.2017
Сообщений: 28
22.10.2017, 15:50  [ТС] 7
Цитата Сообщение от Azazel-San Посмотреть сообщение
ifstream fin("data.txt"); // мой файл
Можешь скинуть содержимое этого файла?
0
Mental handicap
1245 / 623 / 171
Регистрация: 24.11.2015
Сообщений: 2,429
22.10.2017, 16:47 8
valeron181100, это я просто рандомные числа накидал, только для теста, смысл такой - сначала координата х и через пробел у, потом ентер и новые координаты, вот как у меня:
5 -5
4 -4
2 -2
1 -1
9 -9

з.ы. - он у меня находится в папке с проектом
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.10.2017, 16:47
Помогаю со студенческими работами здесь

Считывание файла в массив и запись нового файла
Консоль VS C++. Текстовый файл открывается как бинарный, и считывается по 100 байт в массив - и...

Удаление структурированного массива
Доброго времени суток, форумчане. Выделил память arr = new point; где point - это структура....

Считывание с файла
Здравствуйте. Нужна помощь в написании программы: Дана непустая последовательность слов...

считывание с файла...
Добрый вечер! Мне нужно создать функцию, которая вычисляла количество символов в строке файла, и...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2022, CyberForum.ru