Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
5 / 5 / 2
Регистрация: 01.02.2013
Сообщений: 88

Функции win32 CreateFile WriteFile и ReadFile

11.02.2013, 22:42. Показов 4342. Ответов 5
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем делаю небольшой проект. Необходимо считать данные из файла. Очевидно, что изначально в него необходимо эти данные записать. Так вот. Привожу примеры обеих программ.

Вот эта записывает:

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
#include "stdafx.h"
#include <Windows.h>
#include <string.h>
#include <iostream>
using namespace::std;
 
class users{
public:
char* username;
unsigned short number;
void output();
users& operator = (users&);
users(void);
~users(void);
};
 
users::users(void){
username = new char[16];
strcpy_s (username, 16, "None");
number = 0;}
 
void users::output(){
cout << " " << number << " \t\t " << username << endl;}
 
users::~users(){
if (username){
delete[] username;
username = NULL;}}
 
users& users::operator=(users& M){
    strcpy_s(username, 16, M.username);
    number=M.number;
    return *this;}
 
 
int main(){
DWORD retByte;
users mas[8];
TCHAR stdPath[30] = TEXT("D:\\gamebaseuser.txt");
HANDLE mfile = CreateFile(stdPath, GENERIC_WRITE, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (mfile == INVALID_HANDLE_VALUE){
printf("Error open file\n");}
else{
    for (int i=0; i<8; i++){
        WriteFile (mfile, &mas[i], sizeof(mas[i]), &retByte, NULL);}
    CloseHandle(mfile);}
return 0;}
Вот эта читает:

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
#include "stdafx.h"
#include <Windows.h>
#include <string.h>
#include <iostream>
using namespace::std;
 
class users{
public:
char* username;
unsigned short number;
void output();
users& operator = (users&);
users(void);
~users(void);
};
 
users::users(void){
username = new char[16];
strcpy_s (username, 16, "None");
number = 0;}
 
void users::output(){
cout << " " << number << " \t\t " << username << endl;}
 
users::~users(){
if (username){
delete[] username;
username = NULL;}}
 
users& users::operator=(users& M){
    strcpy_s(username, 16, M.username);
    number=M.number;
    return *this;}
 
int main(){
DWORD retByte;
users mas[8];
TCHAR stdPath[30] = TEXT("D:\\gamebaseuser.txt");
HANDLE mfile = CreateFile(stdPath, GENERIC_READ, 0, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (mfile == INVALID_HANDLE_VALUE){
printf("Error open file\n");}
else{
    for (int i=0; i<8; i++){
        ReadFile (mfile, &mas[i], sizeof(mas[i]), &retByte, NULL);
        mas[i].output();}
    CloseHandle(mfile);}
system("pause");
return 0;}
Запись ВРОДЕ происходит. Я не в курсе, но нормально ли то, что после выполнения первой программы в файле появляются достаточно странные символы вроде:

Ё†U ЁwР†U `nU €nU  ~j°nU яяЂЋU ЁЋU МРЋU

Чтение же происходит просто ужасно. А скорее вообще не происходит. На экран выводится только нуль и два отступа (\t) после него, а потом вылетает ошибка. Прошу указать на возможные ошибки при написании данных программ. Заранее спасибо за помощь!
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
11.02.2013, 22:42
Ответы с готовыми решениями:

Функции Createfile Readfile
Здравствуйте. Я ранее уже задавал вопрос по поводу функции WriteFile. Теперь же у меня возник вопрос по поводу функции ReadFile)) Вот код...

Функции Createfile Writefile
Доброго времени суток. Столкнулся я с одной проблемой... Раньше всегда использовал библиотеки ifstream/ofstrem для работы с файлами. А тут...

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

5
3177 / 1936 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
14.02.2013, 18:23
for (int i=0; i<8; i++){
WriteFile (mfile, &mas[i], sizeof(mas[i]), &retByte, NULL);}
Месье знает толк в извращениях.

1. Создали буфер
2. _Очистили_ буфер
3. Заполнили _буфер_
4. Записали _буфер_

Судя по вашему (невразумительному) исходнику, вы туда мусор пишете.
Причем, какой именно, будет зависеть от директив компилятора.

Если вам нужно сериализовать класс, то делайте это почленно, а не сохранением указателей на память в стеке.
1
5 / 5 / 2
Регистрация: 01.02.2013
Сообщений: 88
14.02.2013, 19:48  [ТС]
Цитата Сообщение от gazlan Посмотреть сообщение
Месье знает толк в извращениях.

1. Создали буфер
2. _Очистили_ буфер
3. Заполнили _буфер_
4. Записали _буфер_

Судя по вашему (невразумительному) исходнику, вы туда мусор пишете.
Причем, какой именно, будет зависеть от директив компилятора.

Если вам нужно сериализовать класс, то делайте это почленно, а не сохранением указателей на память в стеке.
Так че сделать-то надо? Будьте любезны, месье, написать, что мне надо написать (прошу прощения за тавтологию).
0
979 / 874 / 350
Регистрация: 26.04.2012
Сообщений: 2,647
14.02.2013, 20:18
Я не большой знаток с++ и с классами толком дело не имел там, но что-то сомневаюсь, что получится читать из файла в массив такого типа корректно.. Либо с этим надо будет повозиться.. В общем случае-не проще ли прочитать просто в буфер char, а потом уже его обрабатывать? то же касается и записи. Да и в с++ ведь полно оберток есть, на Api писать вовсе не обязательно. С буферами char у меня эти функции отлично работали, если надо-могу покопаться и выложить код, но там вроде все очевидно.
1
3177 / 1936 / 312
Регистрация: 27.08.2010
Сообщений: 5,131
Записей в блоге: 1
14.02.2013, 20:30
что мне надо написать
Надо _почитать_.

Что такое класс в C++, как он устроен, как размещается в памяти (и про использование #pragma pack), и почему не стоит сохранять в файле указатели на переменные в стеке/хипе.

Потом решить, что вы не хакер, и пойти стандартным путем, используя CArchive, например. Или просто сохранить ваш класс в файле _почленно_, не забывая про корректные размеры и возможное выравнивание.

Наберите в Googe Persistent objects или/и Serialization - найдете много готовых примеров.
1
5 / 5 / 2
Регистрация: 01.02.2013
Сообщений: 88
16.02.2013, 11:30  [ТС]
Ага, ок. Придумаю что-нибудь. Всем спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2013, 11:30
Помогаю со студенческими работами здесь

Как работать с LPT портом через функции CreateFile, ReadFile, WriteFile?
Господа, научите работать с LPT портом через функции CreateFile, ReadFile, WriteFile (протокол ECP (желательно)). Сам пробывал но у меня...

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

Функции CreateFile() и WriteFile()
Господа, помогите разобраться с функциями CreateFile() и WriteFile(). В следующем простом примере пытаюсь создать файл txt и записать...

Какие значения у параметров функции Win32 API??? (на примере CreateFile)
Подскажите, пожалуйста, какие значения параметров мне нужно передавать при вызове функции API на примере CreateFile. Во всех хэлпах или...

CreateFile, WriteFile
Подскажите работающий код программы на с++, которая создаёт файл с помощью CreateFile


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
Хочу заставить корпорации вкладываться в здоровье сотрудников: делаю мат модель здравосохранения
anaschu 22.03.2026
e7EYtONaj8Y Z4Tv2zpXVVo https:/ / github. com/ shumilovas/ med2. git
1С: Программный отбор элементов справочника по группе
Maks 22.03.2026
Установка программного отбора элементов справочника "Номенклатура" из модуля формы документа. В качестве фильтра для отбора справочника служит группа номенклатуры. Отбор по наименованию группы. . .
Как я обхитрил таблицу Word
Alexander-7 21.03.2026
Когда мигает курсор у внешнего края таблицы, и нам надо перейти на новую строку, а при нажатии Enter создается новый ряд таблицы с ячейками, то мы вместо нервных нажатий Энтеров мы пишем любые буквы. . .
Krabik - рыболовный бот для WoW 3.3.5a
AmbA 21.03.2026
без регистрации и смс. Это не торговля, приложение не содержит рекламы. Выполняет свою непосредственную задачу - автоматизацию рыбалки в WoW - и ничего более. Однако если админы будут против -. . .
1С: Программный отбор элементов справочника по значению перечисления
Maks 21.03.2026
Установка программного отбора элементов справочника "Сотрудники" из модуля формы документа. В качестве фильтра для отбора служит значение перечислений. / / Событие "НачалоВыбора" реквизита на форме. . .
Переходник USB-CAN-GPIO
Eddy_Em 20.03.2026
Достаточно давно на работе возникла необходимость в переходнике CAN-USB с гальваноразвязкой, оный и был разработан. Однако, все меня терзала совесть, что аж 48-ногий МК используется так тупо: просто. . .
Оттенки серого
Argus19 18.03.2026
Оттенки серого Нашёл в интернете 3 прекрасных модуля: Модуль класса открытия диалога открытия/ сохранения файла на Win32 API; Модуль класса быстрого перекодирования цветного изображения в оттенки. . .
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru