Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: WinAPI. Запись блоков данных в кластеры

Доброго времени суток. Столкнулся с проблемой, по которой уже неделю ищу информацию. Найти ничего толкового так и не удалось, поэтому пробую написать сюда, может быть здесь кто-то с подобным сталкивался.

Суть проблемы состоит в том, что существует необходимость записи некоторого буфера данных на жесткий диск напрямую, использую функции WINAPI.

Открываю том следующим образом.
    HANDLE hDev = INVALID_HANDLE_VALUE;
    hDev = CreateFile(L"\\\\.\\\D:", GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    if (hDev == INVALID_HANDLE_VALUE)
    {
        CloseHandle(hDev);
        free(Path);
        free(R);
        return ERROR_INVALID_HANDLE;
    }

Далее считываю с тома информацию о количестве байт на сектор и количестве секторов в кластере. Перемножив значение получаю размер кластера = 4096
Далее с помощью функции получаю список кластеров конкретного файла на диске D:
И пытаюсь в эти кластеры записать необходимую информацию из переменной Buffer:
    for (ULONG i = 0; i < ClustersCount; i++)
        if (Clusters[i])
        {
            Offset.QuadPart = ClusterSize * Clusters[i];
            SetFilePointer(hDev, Offset.LowPart, &Offset.HighPart, FILE_BEGIN);
            WriteFile(hDev, Buffer, ClusterSize, &Bytes, (LPOVERLAPPED)NULL);
                    if(Bytes != ClusterSize)
                    {
                        CloseHandle(hDev);
                        return ERROR_ACCESS_DENIED;
                    }
        }

В результате попытки записи возникает ошибка с кодом 5. Отказано в доступе. Чтение производилось при помощи ReadFile(...); и считалось все удачно.
Поискав информацию наткнулся на то, что перед записью в кластер нужно демонтировать том при помощи DeviceIoControl(); с управляющим кодом FSCTL_DISMOUNT_VOLUME.
Но из этого выходить лишь только зависание самой студии и её принудительный перезапуск.
Ответ:
Всем спасибо за помощь. Тема закрыта.
Вопрос: Принять несколько блоков данных на сервере

Код C++ (QT)
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
#include "server.h"
#include <iostream>
using namespace std;
 
Server::Server(QObject* parent): QObject(parent)
{
  connect(&server, SIGNAL(newConnection()),
    this, SLOT(acceptConnection()));
 
  server.listen(QHostAddress::Any, 8888);
 
  qDebug() << "listen ok";
}
 
Server::~Server()
{
  server.close();
}
 
void Server::acceptConnection()
{
  client = server.nextPendingConnection();
 
  connect(client, SIGNAL(readyRead()),
    this, SLOT(startRead()));
 
  qDebug() << "Accept ok";
}
 
void Server::startRead()
{
  char buffer[1024] = {0};
  
  client->read(buffer, client->bytesAvailable());
  
  qDebug() << buffer ;
  client->close();
 
}
вот реализация сервера, но проблема в том что если я хочу передать несколько блоков данных(пока что можно передавать только один), вызвать несколько раз send() на клиенте в цикле то сокет на сервере закрывается раньше чем передается следующий блок данных(вызывается следующий send ) на клиенте - происходит обрыв соединения по инициативе сервера. Как сделать так чтобы сервер не разрывал соединение с клиентом пока не будут прочтены все блоки данных??
Ответ: Что за сервер? Почему нет объявления класса Сервер?
Вопрос: Файл записей, содержащий данные о гражданах, которые обслуживаются определённой поликлиникой

Создаваемая информационно-поисковая система должна: разрабатываться в
среде программирования Pascal.
• Обеспечивать функции ввода, поиска, фильтрации и выбора данных по
запросами пользователя, вывод результатов запроса на экран в виде
таблиц, если предусмотрено более одного результата, сохранение данных
в файле.
• Реализовать интерфейс в виде окна, в котором выводится 7 пунктов
меню: "создание файла", "открытие файла", "вывода всей
информации из файла "," справка 1 "," справка 2 "," справка 3 "," выход из
программы ".
• Для выбора пункта меню воспользоваться оператором CASE. возвращение
к пунктам меню после выполнения запроса реализовать с помощью
оператора цикла с после условием REPEAT - UNTIL. справки реализовать
через процедуры или функции.

САМО ЗАДАНИЕ

Создать типизированный файл записей, содержащий данные о гражданах,
обслуживаются определенной поликлиникой. Поля записи - фамилия, имя, по-
отчество гражданина, адрес, место работы, наличие прививки от дифтерии,
дату прохождения последней флюорографии. Справки для поиска:
фамилии и адреса тех граждан, которые сделали флюорографию в течение
последнего месяца;
список граждан, у которых на данный момент просроченная дата флюорографии
(Дата просрочена, если с ее момента прошло больше года);
список работающих на данном предприятии, не имеющих прививки от
дифтерии.
Ответ:

Не по теме:

Antoha1337, рекомендую Вам ознакомиться с правилами форума. Дублирование и кросспостинг тем запрещены. Теме следует давать осмысленное название.

Вопрос: Создать типизированный файл из записей, включающих данные о республиках

Создать типизированный файл из записей, включающих данные о республиках.
Организовать работу с файлами.

Напечатать список республик в порядке невозрастания плотности населения в них с указанием числа школ, приходящихся на 1000 человек. Страны: Эстония, Россия, Таджикистан.
Ответ:
Вопрос: Подгрузка данных

Есть файл .php, в нём блок poems-list, в который должны грузиться данные из таблицы.
HTML5
1
2
3
4
5
<div class="poems-list" >
 
    <?php include("loader-poems.php"); ?>
 
    </div>


Есть попытка создать подобие запроса)


PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php include('includes-db.php'); ?>
 
<?
 
$_SESSION['loader'] = 0;
 
$result = mysqli_query($connection, 'SELECT * FROM `stihi` LIMIT '.$_SESSION['loader'].', 1' );
 
 
$_SESSION['loader'] += 1;
 
while( ($row = mysqli_fetch_assoc($result)) ) {
 
    echo '<div class="poems-list__item">';
    echo '<h2 class="poems-title">' . $row['title'] . '</h2>';
    echo '<p class="poems-content">' . $row['text'] . '</p>';
    echo '<span class="poems-date">' . $row['date'] . '</span>';
    echo '</div>';
 
}
?>
И собственно ajax - запрос

Javascript
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
$(document).ready(function(){
   $(".loader").hide();  //Скрываем прелоадер
});
 //чтобы знать с какой записи вытаскивать данные
    $(function() {
       $(".loader-btn").click(function(){ //Выполняем если по кнопке кликнули
       $(".loader").show(); //Показываем прелоадер
       var num = 1;
 
       $.ajax({
              url : '../loader-poems.php',
              success: function(data){
               if(data == 0) {  // смотрим ответ от сервера и выполняем соответствующее действие
                  alert("Больше нет записей");
                  $(".loader").hide();
               } else {
                  $(".poems-list").append(data);
                  $(".loader").hide();
                  num += 1;
               }
            }
         });
 
    });
});
В конечном итоге получаю, что загружается одна и та же запись...

вот сам сайт
Ответ: Три файла, чтобы заработал один... Я что-то не понимаю.

допустим, первый mypoems.php - это разметка, где будет вставляться:

HTML5
1
2
3
4
5
<div class="poems-list" >
 
        <?php include 'loader-poems.php';  ?>
 
</div>
отдельный файл loader-poems.php , где содержится:

PHP
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php include('includes-db.php'); ?>
 
 
<?php
 
if (!isset($_SESSION['loader'])) {
    $_SESSION['loader'] = 0;
}
 
$result = mysqli_query($connection, 'SELECT * FROM `stihi` LIMIT '.$_SESSION['loader'].', 1' );
 
$_SESSION['loader'] += 1;
 
while( ($row = mysqli_fetch_assoc($result)) ) {
 
    echo '<div class="poems-list__item">';
    echo '<h2 class="poems-title">' . $row['title'] . '</h2>';
    echo '<p class="poems-content">' . $row['text'] . '</p>';
    echo '<span class="poems-date">' . $row['date'] . '</span>';
    echo '</div>';
 
}
?>
Третий файл, например, loader.php с вот этим:

PHP
1
2
3
4
5
6
7
<?php
 
session_start();
 
include 'loader-poems.php';
 
?>
и, собственно аякс

Javascript
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
$(document).ready(function(){
   $(".loader").hide();  //Скрываем прелоадер
});
 //чтобы знать с какой записи вытаскивать данные
    $(function() {
       $(".loader-btn").click(function(){ //Выполняем если по кнопке кликнули
       $(".loader").show(); //Показываем прелоадер
 
       $.ajax({
              url : '../loader.php',
 
              success: function(response){
               if(response == 0) {  // смотрим ответ от сервера и выполняем соответствующее действие
                  alert("Конец");
                  $(".loader").hide();
               } else {
                  $(".poems-list").append(response);
                  $(".loader").hide();
                  alert('Загрузилось');
               }
 
            }
         });
 
    });
});
что не так?
Вопрос: CRC32 с кодом CRC внутри данных

Доброго времени суток форумчане!
Могу получить CRC32 (со стандартным полиномом 0xEDB88320), но как получить CRC32, контрольная сумма которого должна храниться внутри данных от которых эта контрольная сумма.

Не по теме:

Т.е. имею проблему курица <-> яйцо.


Рассчитав CRC32 и поместив ее во внутрь данных автоматически изменяю CRC32 всего этого блока. И так до бесконечности.
Как, например, имея блок данных в N байт ( > M), рассчитать и разместить контрольную сумму CRC32 с позиции M внутри этого блока данных в N байт?
Ответ:
Сообщение от Sindbad_M
Но, если беспокоитесь только об отдельных посылках, можно также считать контрольную сумму для нескольких посылок и при приеме проверять не только сумму посылки, но и дополнительные суммы блока посылок.
Думал об этом. Даже была мысль брать только КС нескольких блоков (плюс добавлять по желанию доп. хэши) отдельно делать шифрование в один пакет (для одного мелкого пакета затраты не так критичны). Но это потребует идентификации каждого блока данных. Этого сейчас нет. Они практически независимы (поэтому легко распараллеливаются).
Rius, пока обсуждали придумал куда можно применить ваш метод. Определенная часть данных "длительного" пользования (и не столь быстрого обращения) должна храниться в виде файлов на BD-ROM носителях. В структуре этих файлов предусмотрены тэги-затычки (для выравнивания по границам) вот в них то я и смогу затолкать эти "компенсаторы" КС. Так что спасибо еще раз!
Вопрос: Запись структуры данных в файл. Динамический список

Первый вопрос.
Программа вроде бы пишет в файл. Читает из файла тоже корректно, однако, при чтении в список добавляется еще один элемент.

Например список состоит из 5 структур, а при чтении из файла, загружаются 6-ть структур. 6-я структура не несет в себе данных, и выводит ерунду.

прикладываю файл 1.txt. Положить в корень диска D:

см. код ниже.
void fr_list() - чтение из файла
void fw_list() - запись в файл.

Код 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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string>
#include <clocale>
#include <fstream>
 
using namespace std;
 
struct ZD   //описываем структуру списка
{
    struct zdDate   //описываем структуру даты
    {
        int day;    //информационное поле для дня
        int month;  //информационное поле для месяца
        int year;   //информационное поле для года
    } rDate;
 
    struct zdTime   //описываем структуру времени
    {
        int hours;  //информационное поле для часов
        int minuts; //информационное поле для мину
    } rTime;
 
    char route[256];    //информационное поле по направлению
    int freeplaces; //информационное поле для свободных мест
    struct ZD* next;    //указатель на следующий элемент списка
};
 
typedef struct ZD sZD;
sZD* headlist = NULL;   //начало списка
sZD* endlist = NULL;    //конец списка
 
//процедура вывода списка
void print_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "\n";
        return;
    }
    sZD* current = headlist;
    //if (!current) cout << "List is empty!\n";
    cout << "Таблица расписаний:\n";
    while (current)
    {
 
        cout << "Дата: ";
        cout << current->rDate.day << "/";
        cout << current->rDate.month << "/";
        cout << current->rDate.year << "\t";
        cout << "Время: ";
        cout << current->rTime.hours << ":";
        cout << current->rTime.minuts << "\t";
        cout << "Направление: ";
        cout << current->route << "\t";
        cout << "Свободно мест: ";
        cout << current->freeplaces << ".";
        cout << "\n";
        current = current->next;
    }
}
 
//процедура добавления элемента список
void add_element()
{
    sZD* current = new sZD;
    int xday, xmonth, xyear, xhours, xminuts, xfreeplaces;
    char xroute[256];
    //string xmonth;
    //вводим информацию по дате отправления
    cout << "Введите день, ДД: ";
    cin >> xday;
    current->rDate.day = xday;
 
    cout << "Введите месяц, ММ: ";
    cin >> xmonth;
    current->rDate.month = xmonth;
 
    cout << "Введите год, ГГГГ: ";
    cin >> xyear;
    current->rDate.year = xyear;
 
    //вводим информацию по времени отправления
    cout << "Введите часы, ЧЧ: ";
    cin >> xhours;
    current->rTime.hours = xhours;
 
    cout << "Введите минуты, ММ: ";
    cin >> xminuts;
    current->rTime.minuts = xminuts;
 
    //вводим информацию по направлению
    cout << "Введите направление: ";
    cin >> xroute;
    strcpy_s(current->route, xroute);
 
    //вводим информацию по кол-ву свободных мест
    cout << "Введите количесво свободных мест: ";
    cin >> xfreeplaces;
    current->freeplaces = xfreeplaces;
 
    current->next = NULL;
 
    if (!headlist)
    {
        headlist = current;
    }
    else endlist->next = current;
 
    endlist = current;
 
    cout << endl;
}
 
//процедура создания списка
void make_list()
{
    int n;
    cout << "Введите количесво новых расписаний: ";
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cout << "Данные нового расписания " << i << ":\n";
        add_element();
    }
}
 
//процедура поиска элемента в списке
void find_element()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "\n";
        return;
    }
    sZD* current = headlist;
    char xroute[256];
    cout << "Введите направление: ";
    fflush(stdin);
    gets_s(xroute);
    while (current)
    {
        if (!strcmp(current->route, xroute))
        {
            cout << "Дата: ";
            cout << current->rDate.day << "/";
            cout << current->rDate.month << "/";
            cout << current->rDate.year << "\t";
            cout << "Время: ";
            cout << current->rTime.hours << ":";
            cout << current->rTime.minuts << "\t";
            cout << "Направление: ";
            cout << current->route << "\t";
            cout << "Свободно мест: ";
            cout << current->freeplaces << ".";
            cout << "\n";
 
        }
        current = current->next;
    }
}
 
//процедура полного удаления списка
void del_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "Удалять нечего :)!\n";
        cout << "\n";
        return;
    }
    while (headlist)
    {
        sZD* current = headlist;
        headlist = current->next;
        delete current;
    }
}
 
//процедура записи в файл
void fw_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "Записывать в файл нечего :)!\n";
        cout << "\n";
        return;
    }
    
    ofstream fileout("d:\\1.txt", ios::binary | ios::out | ios::trunc); //Открываем файл в двоичном режиме для записи
    sZD* current = headlist;
    while (current)
    {
        fileout.write((char*)&current->rDate.day, sizeof current->rDate.day); //Записываем в файл
        fileout.write((char*)&current->rDate.month, sizeof current->rDate.month); //Записываем в файл
        fileout.write((char*)&current->rDate.year, sizeof current->rDate.year); //Записываем в файл
        fileout.write((char*)&current->rTime.hours, sizeof current->rTime.hours); //Записываем в файл
        fileout.write((char*)&current->rTime.minuts, sizeof current->rTime.minuts); //Записываем в файл
        fileout.write((char*)&current->route, sizeof current->route); //Записываем в файл
        fileout.write((char*)&current->freeplaces, sizeof current->freeplaces); //Записываем в файл     
 
        if (current->next == NULL)
            break;
        current = current->next;
        
    }
    fileout.close(); //Закрываем файл   
}
 
//процедура чтения из файла
void fr_list()
{
    fstream filein("d:\\1.txt", ios::binary | ios::in); //Открываем файл в двоичном режиме для чтения
    if (!filein.is_open())                      // если файл не открыт выводится сообщение
    {
        cout << "Файл не может быть открыт!\n";
        cout << "\n";
        return;
    }   
 
    
    while (!filein.eof())
    {
        sZD* current = new sZD;
        filein.read((char*)&current->rDate.day, sizeof current->rDate.day); //Записываем в информационное поле
        filein.read((char*)&current->rDate.month, sizeof current->rDate.month); //Записываем в информационное поле
        filein.read((char*)&current->rDate.year, sizeof current->rDate.year); //Записываем в информационное поле
        filein.read((char*)&current->rTime.hours, sizeof current->rTime.hours); //Записываем в информационное поле
        filein.read((char*)&current->rTime.minuts, sizeof current->rTime.minuts); //Записываем в информационное поле
        filein.read((char*)&current->route, sizeof current->route); //Записываем в информационное поле
        filein.read((char*)&current->freeplaces, sizeof current->freeplaces); //Записываем в информационное поле
 
        current->next = NULL;
 
        if (!headlist)
        {
            headlist = current;
        }
        else endlist->next = current;
        endlist = current;
 
    }
    filein.close(); //Закрываем файл    
}
 
//главная программа
void main()
{
    setlocale(LC_ALL, "Russian");
    int answer;
    do
    {
        system("cls");
        cout << "1. Загрузить расписание из файла" << endl;
        cout << "2. Поиск свободных мест по направлению" << endl;
        cout << "3. Добавить данные по расписанию поездов" << endl;
        cout << "4. Вывести все данные по расписанию поездов" << endl;
        cout << "5. Удалить все данные из списка" << endl;
        cout << "0. Выход" << endl;
        cout << "\nВаш выбор: ";
        cin >> answer;
        switch (answer)
        {
            //
        case 1:
            system("cls");
            cout << endl << "1. Загрузить расписание из файла\n" << endl;
            fr_list();
            //fw_list();
            system("pause");
            break;
            //
        case 2:
            system("cls");
            cout << "2. Поиск свободных мест по направлению\n" << endl;
            find_element();
            system("pause");
            break;
            //
        case 3:
            system("cls");
            cout << "3. Добавить данные по расписанию поездов\n" << endl;
            make_list();
            system("pause");
            break;
            //
        case 4:
            system("cls");
            cout << "4. Вывести все данные по расписанию поездов\n" << endl;
            print_list();
            system("pause");
            break;
        case 5:
            system("cls");
            cout << "5. Удалить все данные из списка\n" << endl;
            del_list();
            //system("pause");
            break;
            //
        case 0:
            system("cls");
            del_list();
            system("pause");
            break;
            //
        default:
            cout << endl << "Ошибка ввода..." << endl;
            system("pause");
            break;
 
        }
 
    } while (answer != 0);
    cin.get();
}
Второй вопрос, про кирилицу.
Категорически отказывается char route[256]; принимать значение кирилицы, только латиница. Что только не пробовал.

Жду от Вас помощи.
Ответ: Условие:
Кликните здесь для просмотра всего текста

У администратора железнодорожных касс хранится информация о свободных местах в поездах по всем направлениям на ближайшую неделю. Данная информация представлена в следующем виде: дата выезда, конечный пункт назначения, время отправления, число свободных мест. Выдать на печать (экран) информацию о поездах, следующих до Москвы.


Вот код программы, если кому понадобиться:
Кликните здесь для просмотра всего текста

Код 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
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <string>
#include <clocale>
#include <fstream>
#include <Windows.h>
 
using namespace std;
 
struct ZD   //описываем структуру списка
{
    struct zdDate   //описываем структуру даты
    {
        int day;    //информационное поле для дня
        int month;  //информационное поле для месяца
        int year;   //информационное поле для года
    } rDate;
 
    struct zdTime   //описываем структуру времени
    {
        int hours;  //информационное поле для часов
        int minuts; //информационное поле для мину
    } rTime;
 
    char route[25]; //информационное поле по направлению
    int freeplaces; //информационное поле для свободных мест
    struct ZD* next;    //указатель на следующий элемент списка
};
 
typedef struct ZD sZD;
sZD* headlist = NULL;   //начало списка
sZD* endlist = NULL;    //конец списка
 
//процедура вывода списка
void print_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "\n";
        return;
    }
    sZD* current = headlist;
    cout << "Таблица расписаний:\n";
    while (current)
    {
 
        cout << "Дата: ";
        cout << current->rDate.day << "/";
        cout << current->rDate.month << "/";
        cout << current->rDate.year << "\t";
        cout << "Время: ";
        cout << current->rTime.hours << ":";
        cout << current->rTime.minuts << "\t";
        cout << "Направление: ";
        cout << current->route << "\t";
        cout << "Свободно мест: ";
        cout << current->freeplaces << ".";
        cout << "\n";
        current = current->next;
    }
}
 
//процедура добавления элемента список
void add_element()
{
    sZD* current = new sZD;
    int xday, xmonth, xyear, xhours, xminuts, xfreeplaces;
    char xroute[25];
    
    //вводим информацию по дате отправления
    cout << "Введите день, ДД: ";
    cin >> xday;
    current->rDate.day = xday;
 
    cout << "Введите месяц, ММ: ";
    cin >> xmonth;
    current->rDate.month = xmonth;
 
    cout << "Введите год, ГГГГ: ";
    cin >> xyear;
    current->rDate.year = xyear;
 
    //вводим информацию по времени отправления
    cout << "Введите часы, ЧЧ: ";
    cin >> xhours;
    current->rTime.hours = xhours;
 
    cout << "Введите минуты, ММ: ";
    cin >> xminuts;
    current->rTime.minuts = xminuts;
 
    //вводим информацию по направлению
    cout << "Введите направление: ";
    cin >> xroute;
    strcpy_s(current->route, xroute);
 
    //вводим информацию по кол-ву свободных мест
    cout << "Введите количесво свободных мест: ";
    cin >> xfreeplaces;
    current->freeplaces = xfreeplaces;
 
    current->next = NULL;
 
    if (!headlist)
    {
        headlist = current;
    }
    else endlist->next = current;
 
    endlist = current;
 
    cout << endl;
}
 
//процедура создания списка
void make_list()
{
    int n;
    cout << "Введите количесво новых расписаний: ";
    cin >> n;
    for (int i = 1; i <= n; i++)
    {
        cout << "Данные нового расписания " << i << ":\n";
        add_element();
    }
}
 
//процедура поиска элемента в списке
void find_element()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "\n";
        return;
    }
    sZD* current = headlist;
    char xroute[25];
    cout << "Введите направление: ";
    fflush(stdin);
    gets_s(xroute);
    while (current)
    {
        if (strcmp(current->route, xroute) == 0)
        {
            cout << "Дата: ";
            cout << current->rDate.day << "/";
            cout << current->rDate.month << "/";
            cout << current->rDate.year << "\t";
            cout << "Время: ";
            cout << current->rTime.hours << ":";
            cout << current->rTime.minuts << "\t";
            cout << "Направление: ";
            cout << current->route << "\t";
            cout << "Свободно мест: ";
            cout << current->freeplaces << ".";
            cout << "\n";
 
        }
        current = current->next;
    }
}
 
//процедура полного удаления списка
void del_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "Удалять нечего :)!\n";
        cout << "\n";
        return;
    }
    while (headlist)
    {
        sZD* current = headlist;
        headlist = current->next;
        delete current;
    }
}
 
//процедура записи в файл
void fw_list()
{
    if (!headlist)
    {
        cout << "Список расписаний пустой!\n";
        cout << "Записывать в файл нечего :)!\n";
        cout << "\n";
        return;
    }
    
    ofstream fileout("d:\\raspisanie.txt", ios::binary | ios::out | ios::trunc); //Открываем файл в двоичном режиме для записи
    sZD* current = headlist;
    while (current)
    {
        fileout.write((char*)&current->rDate.day, sizeof current->rDate.day); //Записываем в файл
        fileout.write((char*)&current->rDate.month, sizeof current->rDate.month); //Записываем в файл
        fileout.write((char*)&current->rDate.year, sizeof current->rDate.year); //Записываем в файл
        fileout.write((char*)&current->rTime.hours, sizeof current->rTime.hours); //Записываем в файл
        fileout.write((char*)&current->rTime.minuts, sizeof current->rTime.minuts); //Записываем в файл
        fileout.write((char*)&current->route, sizeof current->route); //Записываем в файл
        fileout.write((char*)&current->freeplaces, sizeof current->freeplaces); //Записываем в файл     
        current = current->next;
        
    }
    fileout.close(); //Закрываем файл
    cout << "Запись данных в файл выполнена :)!\n";
    cout << "\n";
}
 
 
//процедура чтения из файла
void fr_list()
{
    
    fstream filein("d:\\raspisanie.txt", ios::binary | ios::in); //Открываем файл в двоичном режиме для чтения
    if (!filein.is_open())                      // если файл не открыт выводится сообщение
    {
        cout << "Файл не может быть открыт!\n";
        cout << "\n";
        return;
    }
    
    while (true)
    {
        sZD* current = new sZD;
        filein.read((char*)&current->rDate.day, sizeof current->rDate.day); //Записываем в информационное поле
        if (filein.eof())
            break;
        filein.read((char*)&current->rDate.month, sizeof current->rDate.month); //Записываем в информационное поле
        filein.read((char*)&current->rDate.year, sizeof current->rDate.year); //Записываем в информационное поле
        filein.read((char*)&current->rTime.hours, sizeof current->rTime.hours); //Записываем в информационное поле
        filein.read((char*)&current->rTime.minuts, sizeof current->rTime.minuts); //Записываем в информационное поле
        filein.read((char*)&current->route, sizeof current->route); //Записываем в информационное поле
        filein.read((char*)&current->freeplaces, sizeof current->freeplaces); //Записываем в информационное поле
 
        current->next = NULL;
 
        if (!headlist)
        {
            headlist = current;
        }
        else endlist->next = current;
        endlist = current;
 
    }
    filein.close(); //Закрываем файл
 
    cout << "Чтение данных их файлв выполнено :)!\n";
    cout << "\n";
}
 
 
//главная программа
void main()
{
    setlocale(LC_ALL, "Russian");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    int answer;
    do
    {
        system("cls");
        cout << "1. Загрузить расписание из файла" << endl;
        cout << "2. Поиск свободных мест по направлению" << endl;
        cout << "3. Добавить данные по расписанию поездов" << endl;
        cout << "4. Вывести все данные по расписанию поездов" << endl;
        cout << "5. Удалить все данные из списка" << endl;
        cout << "0. Выход" << endl;
        cout << "\nВаш выбор: ";
        cin >> answer;
        switch (answer)
        {
            //1. Загрузить расписание из файла
            case 1:
                system("cls");
                cout << "1. Загрузить расписание из файла\n" << endl;
                fr_list();
                system("pause");
                break;
            
            //2. Поиск свободных мест по направлению
            case 2:
                system("cls");
                cout << "2. Поиск свободных мест по направлению\n" << endl;
                find_element();
                system("pause");
                break;
            
            //3. Добавить данные по расписанию поездов
            case 3:
                system("cls");
                cout << "3. Добавить данные по расписанию поездов\n" << endl;
            
                if (headlist != NULL)
                {
                    make_list();
                    fw_list();
                }
                else
                    cout << "Данные по расписанию поездов не загружены\n" << endl;
                system("pause");
                break;
                
            //4. Вывести все данные по расписанию поездов
            case 4:
                system("cls");
                cout << "4. Вывести все данные по расписанию поездов\n" << endl;
                print_list();
                system("pause");
                break;
            
            //5. Удалить все данные из списка
            case 5:
                system("cls");
                cout << "5. Удалить все данные из списка\n" << endl;
                del_list();
                system("pause");
                break;
            
            //0. Выход
            case 0:
                system("cls");
                del_list();
                system("pause");
                break;
                
            //Ошибка, если некорректно введен пункт меню
            default:
                cout << endl << "Ошибка ввода..." << endl;
                system("pause");
                break;
 
        }
 
    } while (answer != 0);
    cin.get();
}

Файл raspisanie.txt положить в корень диска D:
Вопрос: запись новых данных в самое начало

Доброго всем дня. Есть форма, допустим заявка на товар, заполняем и она уходит на почту. Довольно таки часто на хостинге происходят ддос атаки и т.д. что письма потом перестают приходить пока хостеры не разберутся с проблемой, соответственно теряется несколько писем. Решил перед отправкой письма писать все в файл на сервере и только потом отправлять. Сделал так:
Код PHP
1
2
3
4
5
$f = fopen("message.html", "a+"); 
fwrite($f," \n $date $time --- $subject \n"); 
fwrite($f,"\n $message \r\n"); 
fwrite($f,"\n ---------------"); 
fclose($f);
Все записывается, все хорошо, а как сделать чтоб последняя запись вставала на первую строку и шло все по убыванию?
Ответ: Примерно так.
Код PHP
1
2
3
$new_content = 'Новые данные';
$file = file_get_contents('message.html');
file_put_contents('message.html', $new_content . "\r\n" . $file);
Вопрос: Перезапись старых или Запись новых данных в БД

Суть вопроса:
через метод _POST получаю значения выбранные пользователем, далее эти значения нужно добавить в базу данных
с этим проблем нет.
PHP
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
if(isset($_POST["send"])){
        //header("location:\redact.php");
        define ('HOST', 'localhost');
        define ('USER', 'root');
        define ('PASS', '');
        define ('DB', 'deanery');
        $connect = mysqli_connect(HOST, USER, PASS, DB);
        if (!$connect) exit('Ошибка подключения к базе данных');
        //global $connect;
        //print_r($_POST); //вывод всех передаваемых значений
        $course = htmlspecialchars($_POST["course"]);
        $group = htmlspecialchars($_POST["group"]);
        $training = htmlspecialchars($_POST["training"]);
        $week = htmlspecialchars($_POST["week"]);
        
    for ($i=0;$i<$p;$i++){
        $name1 = 'paran' . $i;
        $name2 = 'predmet' . $i;
        $name3 = 'teachers' . $i;
        $name4 = 'auditoria' . $i;
        
        $paran = htmlspecialchars($_POST[$name1]);
        $predmet = htmlspecialchars($_POST[$name2]);
        $teachers = htmlspecialchars($_POST[$name3]);
        $auditoria = htmlspecialchars($_POST[$name4]);
        //print_r ($connect);
        
        $otpravit = mysqli_query($connect, "INSERT INTO `deanery`.`home` (`training`, `week`, `para`, `curs`, `groups`, `lesson`, `teacher`, `cabinet`) VALUES ('$training', '$week', '$paran', '$course', '$group', '$predmet', '$teachers', '$auditoria')");
        
 
    }$connect->close();//закрывать базу
    
    }
НО! я не могу понять как можно сделать, чтобы сначала велась проверка в таблице по определенным столбцам на существование уже таких данных и если есть то не добавлять новое а перезаписывать а если нет то записывать новые. Поясню: есть главная таблица нужно в ней найти подобные строки по переменным которые я получил и смотреть если совпадают то перезаписать строку, если нет совпадений то создать новую (типа если есть совпадения перезаписать, если нет создать новую просто) Как записывать новые и как перезаписывать я понимаю но как делать все в едином целом в голове не укладывается.
Ответ:
PHP
1
2
3
4
5
6
7
8
9
// запрос
$query = mysqli_query(SELECT * FROM name_table WHERE name = ' ".$name. " ');
// если такие данные есть, то меняем данные
if(mysqli_num_rows($query) > 0){
mysqli_query(UPDATE name_table SET description = ' ".$description. " ' WHERE id = $id);
} else {
// иначе добавляем
mysqli_query(INSERT //запрос);
}
Надеюсь сам смысл понятен.
Вопрос: Редактирование записей баз данных

Код PHPHTML
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
<html>
 
<head>
 
<title>Invoices and expenses </title>
 
</head>
 
<body bgcolor=pink>
 
<?PHP
 
require_once("./CreateDB.php");
 
if (isset($_POST[Submit]))
 
{
 
if (strlen($_POST[expense_category]))
 
{
 
$query="INSERT INTO expense_categories_id values(NULL,'$_POST[expense_category]')";
 
mysql_query($query) or die("Error: ".mysql_error());
 
}
 
if (strlen($_POST[expense_amount]))
 
{
 
$nowdate=date("y-m-d");
 
$query="INSERT INTO expenses values(NULL,'$_POST[expense_category_id]',
 
'$_POST[expense_amount]',
 
'$_POST[expense_description]',
 
'$nowdate')";
 
mysql_query($query) or die("Error: ".mysql_error());
 
}
 
print("<br>Your information was added");
 
}
 
else
 
{
 
print("<form action=\"lab14.php\" method=POST>");
 
print("Expense category:<select name=\"expense_category_id\">");
 
$query="SELECT * FROM expense_categories_id";
 
$query_result=mysql_db_query(accounting,$query);
 
while($row=mysql_fetch_array($query_result,MYSQL_NUM))
 
{
 
print("<OPTION VALUE=\"$row[0]\">$row[1]</OPTION>");
 
}
 
print("</SELECT><BR>");
 
print("Enter a new expense category:<input type=text name=\"expense_category\" 
size=40><br>");
 
print("Expense amount:<input type=text name=\"expense_amount\" size=10><br>");
 
print("Expense description:<textarea name=\"expense_description\" rows=5 
 
cols=40></textarea><br>");
 
print("<input type=submit name=\"Submit\" value=\"OK\">");
 
print("</form>");
 
}
 
mysql_close();
 
?>
 
</body>
 
</html>


Помогите пожалуйста, есть код, должно получиться так когда вводишь новые данные , эта информация должна выводиться из "Expense category" как на рисунке. но что то не получается.
Ответ:
Сообщение от РЕНАТИКК
должно получиться так когда вводишь новые данные
а данные то вносятся в БД?
Сообщение от РЕНАТИКК
INSERT INTO expense_categories_id values(NULL,'$_POST[expense_category]')
от куда такой запрос на добавление?
должно быть
Код SQL
1
INSERT INTO TABLE_NAME (column1, column2, column3,...) VALUES (value1, value2, value3,...)
в запросе на добавление не хватает названий столбцов