Форум программистов, компьютерный форум CyberForum.ru

[C] ReadFile/WriteFile - C++

Восстановить пароль Регистрация
 
hvz-
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 14
16.01.2013, 07:55     [C] ReadFile/WriteFile #1
Всем доброго времени суток!
Есть вроблема с програмкой ,а именно: 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.
Вроде и записываю и читаю правильно, чего я только не делал...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2013, 07:55     [C] ReadFile/WriteFile
Посмотрите здесь:

Не работает ReadFile() при подключении своей библиотеки C++
C++ Com port (writefile кривая работа)
C++ проблема с ReadFile()
функция readfile и createfile C++
ReadFile и WriteFile Visual C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.01.2013, 12:39     [C] ReadFile/WriteFile #2
Цитата Сообщение от hvz- Посмотреть сообщение
Student *st_buf;
На первый взгляд память не выделили.
Цитата Сообщение от hvz- Посмотреть сообщение
&st_buf
Зачем взятие адреса?

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

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

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

А по самой задаче - она уже решена.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.01.2013, 18:38     [C] ReadFile/WriteFile #4
Цитата Сообщение от 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);
Yandex
Объявления
16.01.2013, 18:38     [C] ReadFile/WriteFile
Ответ Создать тему
Опции темы

Текущее время: 13:11. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru