Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 14

[C] ReadFile/WriteFile

16.01.2013, 07:55. Показов 2038. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток!
Есть вроблема с програмкой ,а именно: Unhandled exception at 0x010b1493 in lab3.exe: 0xC0000005: Access violation reading location 0x00000000.

Исходник:
Кликните здесь для просмотра всего текста
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
#include <conio.h>
#include <stdio.h>
#include <windows.h>
#include <shlobj.h>
 
struct Student
{
    int code;
    char name[20];
    char surname[20];
    char group[10];
};
 
BOOL CheckStudentDirAndFile(void);
void MakeStudents(Student *st);
void WriteStudentsToFile(Student *st, int stud_number, DWORD *nb);
void ReadStudentsFromFile(int stud_number, DWORD *nb);
void CopyStudentsToDocs(void);
 
int main()
{
    if(CheckStudentDirAndFile() == TRUE)
    {
        HANDLE hFindFile;
        WIN32_FIND_DATAA fdFindData;
        SYSTEMTIME smSysTime;
        hFindFile=FindFirstFileA("C:\\Student\\stud.dat",&fdFindData);
        if(hFindFile != INVALID_HANDLE_VALUE)
        {
            FileTimeToSystemTime(&fdFindData.ftLastWriteTime, &smSysTime);
            printf("%s\t%d.%d.%d  %d:%d\n",fdFindData.cFileName,smSysTime.wDay,smSysTime.wMonth,smSysTime.wYear, smSysTime.wHour, smSysTime.wMinute);
            FindClose(hFindFile);
            printf("Press any key to exit...\n");
            _getch();
            return 0;
        }
    }
    else
    {
        DWORD nb;
        int stud_number=0;
        printf("Enter student's number: ");
        scanf_s("%d", &stud_number);
        Student* st=new Student[stud_number];
        for (int i=0;i<stud_number;i++)
            MakeStudents(&st[i]);
 
        WriteStudentsToFile(st, stud_number, &nb);
        ReadStudentsFromFile(stud_number, &nb);
        CopyStudentsToDocs();
        printf("Press any key to exit...\n");
        _getch();
        return 0;
    }
}
 
BOOL CheckStudentDirAndFile(void)
{
    HANDLE hFile;
    WIN32_FIND_DATAA fdFindData;
    hFile=FindFirstFileA(("C:\\Student\\stud.dat"),&fdFindData);
    if(hFile != INVALID_HANDLE_VALUE)
    {
        FindClose(hFile);
        printf("Founded file C:\\Student\\stud.dat!\n");
        return TRUE;
    }
    else
    {
        if(CreateDirectoryA("C:\\Student", NULL))
        {
            printf("Directory C:\\Student created successfully!\n");
            hFile = CreateFileA("C:\\Student\\stud.dat",GENERIC_WRITE,0,NULL,OPEN_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL);
            
            if(hFile)
                printf("File stud.dat created successfully!\n");
            else
                printf("Can not create file stud.dat in C:\\Student!\n");
 
            CloseHandle(hFile);
            return FALSE;
        }
        else
        {
            printf("Can not create directry C:\\Students! Possibly already exist.\n");
            CloseHandle(hFile);
            return FALSE;
        }
    }
}
 
void MakeStudents(Student *st)
{
    printf("Student code: ");
    scanf_s("%d", &st->code);
    printf("Student name: ");
    scanf_s("%s", &st->name);
    printf("Student surname: ");
    scanf_s("%s", &st->surname);
    printf("Student group: ");
    scanf_s("%s", &st->group);
}
 
void WriteStudentsToFile(Student *st, int stud_number, DWORD *nb)
{
    HANDLE hFile;
    char file_path[] = "C:\\Student\\stud.dat";
    hFile = CreateFileA(file_path, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(!hFile)
    {
        printf("Error while creating file %s for writing!\n", file_path);
        CloseHandle(hFile);
    }
    else
    {
        SetFilePointer(hFile, 4, NULL, FILE_END);
        for (int i=0;i<stud_number;i++)
            WriteFile(hFile,&i,sizeof(&st[i]),&*nb,NULL);
        CloseHandle(hFile);
        printf("\nStudents writed to file %s\n", file_path);
    }
}
 
void ReadStudentsFromFile(int stud_number, DWORD *nb)
{
    HANDLE hFile;
    char file_path[] = "C:\\Student\\stud.dat";
    hFile = CreateFileA(file_path, GENERIC_READ, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    if(!hFile)
    {
        printf("Error while creating file %s for reading!\n", file_path);
        CloseHandle(hFile);
    }
    else
    {
        printf("%s contains:\n\n", file_path);
        Student *st_buf;
        int i=1;
        ReadFile(hFile, &st_buf, sizeof(Student), &*nb,NULL);
        while (nb!=0)
        {   
            printf("----------%d----------\n", i++);
            printf("Student code: %d\n", st_buf->code);
            printf("Student name: %s\n", st_buf->name);
            printf("Student surname: %s\n", st_buf->surname);
            printf("Student group: %s\n", st_buf->group);
            printf("----------------------\n");
            ReadFile(hFile, &st_buf, sizeof(Student), &*nb, NULL);
        }
        CloseHandle(hFile);
    }
}
 
void CopyStudentsToDocs(void)
{
    char docs_path[50];
    char path[100];
    SHGetFolderPathA(NULL, CSIDL_COMMON_DOCUMENTS, NULL, SHGFP_TYPE_CURRENT, docs_path);
    sprintf_s(path, "%s\\stud.dat", docs_path);
    if(CopyFileA("C:\\Student\\stud.dat", path, TRUE) != FALSE)
        printf("stud.dat copied to %s\n", path);
    else
        printf("Can not copy C:\\Student\\stud.dat file to %s", path);
}

Ошибка выскакивает в функции ReadStudentsFromFile.
Вроде и записываю и читаю правильно, чего я только не делал...
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.01.2013, 07:55
Ответы с готовыми решениями:

WriteFile
есть к примеру строка: string h = &quot;2 3\r\n&quot;; как можно переменную h использовать в WriteFile: Вот так работает:...

проблема с ReadFile()
Здравствуйте. Функция ReadFile() заполняет буфер нулями. Из за чего такое может быть? Кроме того что ничего нету по заданному пути.

функция readfile и createfile
почему вылетает ошибка int error; HANDLE HFile; OFSTRUCT OFFile; HFile=CreateFile(&quot;C:\\1.txt&quot;,GENERIC_READ,0,0,OPEN_EXISTING,0,0); ...

3
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
16.01.2013, 12:39
Цитата Сообщение от hvz- Посмотреть сообщение
Student *st_buf;
На первый взгляд память не выделили.
Цитата Сообщение от hvz- Посмотреть сообщение
&st_buf
Зачем взятие адреса?

Цитата Сообщение от hvz- Посмотреть сообщение
&*nb
Зачем такая манипуляция?

Добавлено через 41 секунду
Цитата Сообщение от hvz- Посмотреть сообщение
CreateFileA
Так не стоит писать.
0
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 14
16.01.2013, 18:16  [ТС]
Цитата Сообщение от go Посмотреть сообщение
Зачем такая манипуляция?
Функции нужен был параметр - адрес переменной типа DWORD, а &*nb - потому что nb передавал в функцию по указателю, а если обращаться *nb - то это обращаться к самому значению, а не указателю. Вобщем я сам запутался, так как не очень хорошо знаю C.

Цитата Сообщение от go Посмотреть сообщение
Зачем такая манипуляция? Так не стоит писать.
Ну я взял ansi версию функции что бы не заморачиватся с юникодом.

А по самой задаче - она уже решена.
0
go
Эксперт С++
3646 / 1378 / 243
Регистрация: 16.04.2009
Сообщений: 4,526
16.01.2013, 18:38
Цитата Сообщение от go Посмотреть сообщение
На первый взгляд память не выделили.
А с этим что?

Добавлено через 20 секунд
Цитата Сообщение от hvz- Посмотреть сообщение
Ну я взял ansi версию функции что бы не заморачиватся с юникодом.
Ну так нехорошо делать.

Добавлено через 1 минуту
Цитата Сообщение от hvz- Посмотреть сообщение
Функции нужен был параметр - адрес переменной типа DWORD, а &*nb - потому что nb передавал в функцию по указателю, а если обращаться *nb - то это обращаться к самому значению, а не указателю. Вобщем я сам запутался, так как не очень хорошо знаю C.
Просто
C++ (Qt)
1
2
Student *st_buf = new Student;
ReadFile(hFile, st_buf, sizeof *st_buf, nb, NULL);
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.01.2013, 18:38
Помогаю со студенческими работами здесь

Offset и offsethigh в WriteFile
Асинхронный вывод. BOOL WINAPI WriteFile( _In_ HANDLE hFile, _In_ LPCVOID lpBuffer, _In_ ...

Com port (writefile кривая работа)
Подскажите в чём дело? Пишу терминалку для управления мк. Необходимо отправить массив из трёх байт. В место трёх байт на мк приходит 1...

Не работает ReadFile() при подключении своей библиотеки
Вот исходник: файл My_Dll.h // My_Dll.h /* #ifndef MYLIBAPI #define MYLIBAPI __declspec(dllimport)

Почему WriteFile не отправляет сообщение по каналу Pipe
Почему WriteFile не отправляет сообщение по каналу Pipe ситуация следующая , есть два приложения на с++ я написал сервер который...

Как правильно прочитать текстовый файл с помощью ReadFile?
Как правильно прочитать текстовый файл с помощью ReadFile и сделать каждую новую строчку переменной?(нужно 4 строчки) Добавлено...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru