Форум программистов, компьютерный форум, киберфорум
C/C++: WinAPI
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/29: Рейтинг темы: голосов - 29, средняя оценка - 4.62
0 / 0 / 1
Регистрация: 28.06.2016
Сообщений: 114

WriteFile дозапись данных в фаил

08.02.2018, 22:35. Показов 5736. Ответов 3

Студворк — интернет-сервис помощи студентам
Добрый день,
ребят есть такая функция, как сделать дозапись данных в конец фаила если он уже существует? и есть ли смысл проверять фаил на существование или же можно использовать в CreateFileA атрибут OPEN_ALWAYS? как с технической стороны будет правильно сделать это в С++ отловить ошибку или заранее проверить на существования фаила

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
DWORD WriteFileA(const char* FileName, const LPVOID Buffer, DWORD BufferSize)
{
 
    if (FileName == NULL)
        return 0;
    HANDLE File = CreateFileA(FileName, GENERIC_WRITE, FILE_SHARE_READ, 0,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
 
    if (File == INVALID_HANDLE_VALUE)
        return 0;
    
    DWORD Size = 0;
    if (Buffer != NULL && BufferSize != 0)
        WriteFile(File, Buffer, BufferSize, &Size, NULL);
 
    CloseHandle(File);
 
    return Size;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.02.2018, 22:35
Ответы с готовыми решениями:

Запись в файл различных типов данных через WriteFile
Имеется диалоговое окно с размещенными на нем элементами edit, в которые записаны данные разных форматов (byte, long, int32, int64, word,...

Не работает дозапись WriteFile
Доброго времени суток! Товарищи, проблема вот в чём, необходимо, чтобы каждый раз при вызове функции она добавляла в файл информацию в...

Дозапись в файл данных из Stringrid
Приветсвую, суть такова, заполняю данные из Edit, Combobox, сохраняю в фаил, вопрос такой как после перезапуска дозаписать данные в фаил, а...

3
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
09.02.2018, 11:17
Лучший ответ Сообщение было отмечено Victoros6666 как решение

Решение

Цитата Сообщение от Victoros6666 Посмотреть сообщение
ребят есть такая функция, как сделать дозапись данных в конец фаила если он уже существует
После открытия, перед записью:
GetFileSize - чтобы узнать размер файла
SetFilePointer - чтобы перейти в конец файла
1
0 / 0 / 1
Регистрация: 28.06.2016
Сообщений: 114
09.02.2018, 15:20  [ТС]
Господа помогите разобраться с дозаписью в фаил. Только пытаюсь познакомится С++ и не совесм понимаю логику работы.

Для чего нам надо узнать размер фаила, если мы используем SetFilePointer(File, 0, NULL, FILE_END), где указатель позиции всегда будет вставать на конец фаила?

Вопрос в том если фаил не существует правильно ли передвинется указатель позиции на начало фаила при использовании SetFilePointer(File, 0, NULL, FILE_END)?


Или все таки нужно сделать доп проверку , узнать размер фаила (GetFileSize) и если он отличается от нуля то делаем SetFilePointer(File, 0, NULL, FILE_END) , если равно 0 то просто пишем в фаил WriteFile(File, Buffer, BufferSize, &Size, NULL);

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
DWORD WriteFileA(const char* FileName, const LPVOID Buffer, DWORD BufferSize)
{
 
    if (FileName == NULL)
        return 0;
    HANDLE File = CreateFileA(FileName, GENERIC_WRITE, FILE_SHARE_READ, 0,
        CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
 
    if (File == INVALID_HANDLE_VALUE)
        return 0;
    
    DWORD Size = 0;
    if (Buffer != NULL && BufferSize != 0){
        SetFilePointer(File, 0, NULL, FILE_END);
        WriteFile(File, Buffer, BufferSize, &Size, NULL);
}
    SetEndOfFile(File);
    CloseHandle(File);
 
    return Size;
}
0
Software Developer
 Аватар для fastb1t
315 / 229 / 113
Регистрация: 03.05.2017
Сообщений: 1,336
09.02.2018, 15:49
Лучший ответ Сообщение было отмечено Victoros6666 как решение

Решение

Цитата Сообщение от Victoros6666 Посмотреть сообщение
Вопрос в том если фаил не существует правильно ли передвинется указатель позиции на начало фаила при использовании SetFilePointer(File, 0, NULL, FILE_END)?
Эсли файл не существует, то программа создаст его заново, потому что используется флаг CREATE_ALWAYS, но для вашей задачи лучше использовать OPEN_ALWAYS
Цитата Сообщение от Victoros6666 Посмотреть сообщение
Или все таки нужно сделать доп проверку , узнать размер фаила (GetFileSize) и если он отличается от нуля то делаем SetFilePointer(File, 0, NULL, FILE_END) , если равно 0 то просто пишем в фаил WriteFile(File, Buffer, BufferSize, &Size, NULL);
Это не обязательно
Цитата Сообщение от Victoros6666 Посмотреть сообщение
Только пытаюсь познакомится С++ и не совесм понимаю логику работы
Ну код ваш хоть и на C++, но только функции то WinAPI. На чистом С++ это будет выглядеть так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <iostream>
#include <fstream>
 
int main ()
{
    std::ofstream ofs ("file.txt", std::ios_base::app);
    if (ofs.is_open ())
    {
        std::string str = "hi, friend";
        ofs.write (str.c_str (), str.length ());
    }
    ofs.close ();
    return 0;
}
Ну а с использованием WinAPI, то так будет работать практически во всех случаях.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>
#include <windows.h>
 
int main ()
{
    HANDLE hFile = CreateFile ("file.txt", GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    if (hFile != INVALID_HANDLE_VALUE)
    {
        std::string str = "hi, friend";
        SetFilePointer (hFile, 0, NULL, FILE_END);
        DWORD dwWrited;
        WriteFile (hFile, str.c_str (), str.length (), &dwWrited, NULL);
        CloseHandle (hFile);
    }
    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
#include <iostream>
#include <windows.h>
 
DWORD WriteMyFile (const char* szFileName, const LPVOID Buffer, DWORD dwBufferSize)
{
    if (!szFileName || !Buffer || !dwBufferSize)
        return 0;
    HANDLE hFile = CreateFile (szFileName, GENERIC_WRITE, FILE_SHARE_WRITE, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
    if (hFile == INVALID_HANDLE_VALUE)
        return 0;
    DWORD dwWrited = 0;
    SetFilePointer (hFile, 0, NULL, FILE_END);
    WriteFile (hFile, Buffer, dwBufferSize, &dwWrited, NULL);
    CloseHandle (hFile);
    return dwWrited;
}
 
int main ()
{
    std::string str = "hi, friend";
    WriteMyFile ("file.txt", (LPVOID) str.c_str (), str.length ());
    return 0;
}
Ещё одно замечание: не используйте для названия свой функций имена идентичные с именами стандартных, потому-что вы потом сами начнёте путаться (это я так, из своего опыта)
2
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.02.2018, 15:49
Помогаю со студенческими работами здесь

Дозапись данных из StringGrid в excel
У меня такая проблема, у меня реализовано сохранение на разные страницы Excel, но когда я записываю данные на 2 страницу, то с остальных...

Дозапись данных в определенную строку БД
Есть БД. По нажатию кнопки в нее добавляется строки со столбцами. SqlCom = New OleDbCommand(&quot;INSERT INTO ГрафикВыходов_Май...

Access Violation. Дозапись данных в файл txt.
Еще один неприятный момент в котором не могу разобраться... Первым делом глобально объявляю переменную: #pragma package(smart_init) ...

Работа с xml: дозапись и извлечение данных в массивы
Требуется помощь с xml, уже перечитал кучу мануалов, но не могу понять.. 1) Создать xml вида: &lt;thread&gt; &lt;message id =...

Дозапись в файл при экспорт данных в Excel
Есть некaя регистрaционнaя формa, дaнные которой, при кaждом нaжaтии кнопки должны экспортировaться в существующий экселевский фaйл, после...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Настройки VS Code
Loafer 13.04.2026
{ "cmake. configureOnOpen": false, "diffEditor. ignoreTrimWhitespace": true, "editor. guides. bracketPairs": "active", "extensions. ignoreRecommendations": true, . . .
Оптимизация кода на разграничение прав доступа к элементам формы
Maks 13.04.2026
Алгоритм из решения ниже реализован на нетиповом документе, разработанного в конфигурации КА2. Задачи, как таковой, поставлено не было, проделанное ниже исключительно моя инициатива. Было так:. . .
Контроль заполнения и очистка дат в зависимости от значения перечислений
Maks 12.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: реализовать контроль корректности заполнения дат назначения. . .
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru