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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
hvz-
0 / 0 / 0
Регистрация: 09.01.2013
Сообщений: 14
#1

[C] ReadFile/WriteFile - C++

16.01.2013, 07:55. Просмотров 700. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2013, 07:55
Здравствуйте! Я подобрал для вас темы с ответами на вопрос [C] ReadFile/WriteFile (C++):

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

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

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

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

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

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

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

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

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

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

А по самой задаче - она уже решена.
0
go
Эксперт С++
3586 / 1366 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.01.2013, 18:38 #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);
0
16.01.2013, 18:38
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2013, 18:38
Привет! Вот еще темы с ответами:

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

Writefile() & String - В контроллер приходит не то, что было отправлено - C++
Почему отправляю в com порт &quot;Device?\n&quot; а в котроллер приходит &quot;ppDevice?\n&quot; ???? void Com::Send_package(String str) { char...

ReadFile и WriteFile - Visual C++
Есть ком-порт. В нем Tx и Dx c соединены проводом Я отправляю в порт массив байт, а он выдает совсем другие данные. bufferout =...

Createfile, readfile, writefile - C++ WinAPI
Файл 4 создаётся,но данные из файла 1 не переносятся.Почему? HANDLE myFile; HANDLE myFile2; DWORD buf; char asd; myFile =...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru