Форум программистов, компьютерный форум, киберфорум
Наши страницы

Как ускорить работу с файлами? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Как поместить в STL-контейнер экземпляры разных классов? http://www.cyberforum.ru/cpp-beginners/thread1800935.html
Как поместить в контейнер экземпляры разных классов(типов) :thank_you:?
C++ Multiple definition: почему компилятор ругается на единственную функцию, используемую в обоих source-файлах? Пихаю хедер в 2 сурсца разных классов. Компилятор ругается на единственную функцию, которую я использую в обоих сурсцах. #ifndef LIB #define LIB void func() {} #endif // LIB Файл: A.cpp http://www.cyberforum.ru/cpp-beginners/thread1800877.html
Почему не работает cout в перегруженной функции? C++
Всем привет. Есть простое заданеие из первых уроков учебника Шитдта о перегрузке функции. Все компелится и работает если бы не одно НО. В функции с аргументами и выходными данными двойнеой точности...
C++ Исправить ошибку LNK2019: ссылка на неразрешенный внешний символ (InternetCheckConnection и WinAPI)
Создаю простенькое приложение на winapi с кнопкой и полем edit, по нажатию на которую происходит проверка подключения к интернету и вывод результата в поле: if...
C++ Скопировать файл xlsx формата, в копию внести изменения и сохранить http://www.cyberforum.ru/cpp-beginners/thread1800777.html
Добрый вечер. У меня есть задача, которая заключается в следующем. Написать консольное приложение, которое скопирует файл xlsx формата, в копию внесет изменения и сохранит. Собственно вот в чем...
C++ Найти значение числа Пи по формуле произведения Добрый вечер уважаемые программисты!!! Задача довольно таки не сложная но возникли определенные трудности. Описание задачи: Описать функцию Pi(eps), которая находит значение числа Пи по формуле... подробнее

Показать сообщение отдельно
MayaNash
1285 / 453 / 47
Регистрация: 24.08.2011
Сообщений: 2,214
02.09.2016, 16:02  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
стоит переписать на strcmp из-за чтения scanf
ясное дело
у меня вот так вот получилось, и теперь все ясно и понятно, только с чтением строк надо что-то сделать - читает всю строку в одну переменную, не понимает что двоеточие это разделитель
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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
#define _CRT_SECURE_NO_WARNINGS
#include <fstream>
#include <iostream>
#include <string>
#include <Windows.h>
#include <vector>
#include <algorithm>
using namespace std;
 
#define DEBUG
 
struct Line {
    char id1[10], id2[10], name[20];
    Line(char *id1 = NULL, char *id2 = NULL, char *name = NULL) {
        if (id1 != NULL)
            strcpy(this->id1, id1);
        else
            this->id1[0] = '\0';
        if (id2 != NULL)
            strcpy(this->id2, id2);
        else
            this->id2[0] = '\0';
        if (name != NULL)
            strcpy(this->name, name);
        else
            this->name[0] = '\0';
    }
    Line(const Line &r) {
        *this = r;
    }
    Line& operator=(const Line &r) {
        strcpy(id1, r.id1);
        strcpy(id2, r.id2);
        strcpy(name, r.name);
        return *this;
    }
    bool operator<(const Line &r) const {
        if (strcmp(id1, r.id1) < 0)
            return true;
        else
            return strcmp(id2, r.id2) < 0;
    }
    bool operator>(const Line &r) const {
        if (strcmp(id1, r.id1) > 0)
            return true;
        else
            return strcmp(id2, r.id2) > 0;
    }
    bool operator==(const Line &r) const {
        return strcmp(id1, r.id1) == 0 && strcmp(id2, r.id2) == 0;
    }
};
 
vector<Line> parse(FILE *f) {
    vector<Line> v;
    Line line;
 
    while (!feof(f)) {
        fscanf_s(f, "%s:%s:%s", &line.name, &line.id1, &line.id2);
#ifdef DEBUG
        cout << '[' << line.name << "] [" << line.id1 << "] [" << line.id2 << "]\n";
#endif
        v.push_back(line);
    }
    sort(v.begin(), v.end());
#ifdef DEBUG
    getchar();
#endif
    return v;
}
 
bool find(vector<Line> v, Line &line) {
    pair<vector<Line>::iterator, vector<Line>::iterator> itPair =
        equal_range(v.begin(), v.end(), line);
    if (itPair.first != v.end()) {
        strcpy(line.name, itPair.first->name);
        return true;
    }
    else
        return false;
}
 
void mergeFiles(FILE *f1, FILE *f2, FILE *fRes) {
    char name[20];
    Line line;
    vector<Line> v = parse(f1);
    while (!feof(f2)) {
        fscanf_s(f2, "%s:%s:%s", &line.id1, &line.id2, &name);
        if (find(v, line))
            fprintf(f2, "%s:%s\n", line.name, name);
    }
}
 
int main() {
    string file1path, file2path, fileResultPath;
    FILE *file1, *file2, *fileResult;
 
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
    cout << "Путь к первому файлу > ";
    getline(cin, file1path);
    cout << "Путь ко второму файлу > ";
    getline(cin, file2path);
    cout << "Путь к файлу для записи результата > ";
    getline(cin, fileResultPath);
 
    file1 = fopen(file1path.c_str(), "rt");
    file2 = fopen(file2path.c_str(), "rt");
    fileResult = fopen(fileResultPath.c_str(), "wt");
 
    if (file1 != NULL && file2 != NULL) {
        mergeFiles(file1, file2, fileResult);
        fclose(file1);
        fclose(file2);
        fclose(fileResult);
        cout << "Готово!\n";
    }
    else
        cout << "Проблема с открытием файлов!\n";
 
    system("pause");
    return 0;
}
Добавлено через 3 минуты
я так думаю, со string все же лучше было)))
0
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru