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

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

11.02.2013, 22:42. Показов 4298. Ответов 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
Ответ Создать тему
Новые блоги и статьи
Первый деплой
lagorue 16.01.2026
Не спеша развернул своё 1ое приложение в kubernetes. А дальше мне интересно создать 1фронтэнд приложения и 2 бэкэнд приложения развернуть 2 деплоя в кубере получится 2 сервиса и что-бы они. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru