5 / 5 / 2
Регистрация: 01.02.2013
Сообщений: 88

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

11.02.2013, 22:42. Показов 4323. Ответов 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
3176 / 1935 / 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
3176 / 1935 / 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
Ответ Создать тему
Опции темы

Новые блоги и статьи
SDL3 для Web (WebAssembly): Обработчик клика мыши в браузере ПК и касания экрана в браузере на мобильном устройстве
8Observer8 02.02.2026
Содержание блога Для начала пошагово создадим рабочий пример для подготовки к экспериментам в браузере ПК и в браузере мобильного устройства. Потом напишем обработчик клика мыши и обработчик. . .
Философия технологии
iceja 01.02.2026
На мой взгляд у человека в технических проектах остается роль генерального директора. Все остальное нейронки делают уже лучше человека. Они не могут нести предпринимательские риски, не могут. . .
SDL3 для Web (WebAssembly): Вывод текста со шрифтом TTF с помощью SDL3_ttf
8Observer8 01.02.2026
Содержание блога В этой пошаговой инструкции создадим с нуля веб-приложение, которое выводит текст в окне браузера. Запустим на Android на локальном сервере. Загрузим Release на бесплатный. . .
SDL3 для Web (WebAssembly): Сборка C/C++ проекта из консоли
8Observer8 30.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
SDL3 для Web (WebAssembly): Установка Emscripten SDK (emsdk) и CMake для сборки C и C++ приложений в Wasm
8Observer8 30.01.2026
Содержание блога Для того чтобы скачать Emscripten SDK (emsdk) необходимо сначало скачать и уставить Git: Install for Windows. Следуйте стандартной процедуре установки Git через установщик. . . .
SDL3 для Android: Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 29.01.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами. Версия v3 была полностью переписана на Си, в. . .
Инструменты COM: Сохранение данный из VARIANT в файл и загрузка из файла в VARIANT
bedvit 28.01.2026
Сохранение базовых типов COM и массивов (одномерных или двухмерных) любой вложенности (деревья) в файл, с возможностью выбора алгоритмов сжатия и шифрования. Часть библиотеки BedvitCOM Использованы. . .
SDL3 для Android: Загрузка PNG с альфа-каналом с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru