Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/21: Рейтинг темы: голосов - 21, средняя оценка - 4.67
2 / 2 / 0
Регистрация: 06.02.2018
Сообщений: 15
1

Открыть файл в бинарном виде

09.10.2018, 00:09. Показов 3999. Ответов 3

Author24 — интернет-сервис помощи студентам
нужно считать данные из файла в бинарном виде. нельзя использовать библиотеку <fstream>, как это сделать?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
09.10.2018, 00:09
Ответы с готовыми решениями:

Не удаётся открыть файл в бинарном режиме
Всем привет. Вроде делаю всё по примеру, но первый файл открывается, а второй файл (который...

Как открыть файл для чтения в БИНАРНОМ режиме?
Друзья! Файл, который надо открыть БИНАРНЫЙ, в нём два байта. Содержание файла 33 20 00 00 имя...

Сохранение структуры списка в бинарном виде в файл
Всем здравствуйте. Суть вопроса такова. Есть двусвязный список сделанный собственноручно без...

Как записать объект с полем типа std::string в бинарном виде в файл и считать его обратно?
Знаю как записывать объекты в файл в бинарном виде, но как быть, когда у них динамические поля?...

3
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
09.10.2018, 00:18 2
Использовать библиотеку cstdio или системные API. Первое чуть проще, даже готовые примеры имеются.

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
/* fread example: read an entire file */
#include <сstdio>
#include <сstdlib>
 
int main () {
  FILE * pFile;
  long lSize;
  char * buffer;
  size_t result;
 
  pFile = fopen ( "myfile.bin" , "rb" );
  if (pFile==NULL) {fputs ("File error",stderr); exit (1);}
 
  // obtain file size:
  fseek (pFile , 0 , SEEK_END);
  lSize = ftell (pFile);
  rewind (pFile);
 
  // allocate memory to contain the whole file:
  buffer = (char*) malloc (sizeof(char)*lSize);
  if (buffer == NULL) {fputs ("Memory error",stderr); exit (2);}
 
  // copy the file into the buffer:
  result = fread (buffer,1,lSize,pFile);
  if (result != lSize) {fputs ("Reading error",stderr); exit (3);}
 
  /* the whole file is now loaded in the memory buffer. */
 
  // terminate
  fclose (pFile);
  free (buffer);
  return 0;
}
Этот пример взят с cplusplus.com, однако по нему есть замечания.

C++
1
2
fseek (pFile , 0 , SEEK_END);
lSize = ftell (pFile);
Для бинарного режима стандарт не требует реализации этой возможности, поэтому получение размера файла таким способом может не работать.
0
2 / 2 / 0
Регистрация: 06.02.2018
Сообщений: 15
09.10.2018, 21:00  [ТС] 3
Цитата Сообщение от valen10 Посмотреть сообщение
Использовать библиотеку cstdio или системные API. Первое чуть проще, даже готовые примеры имеются.
Вот нужно winapi, а как там открыть в бинарном виде?
0
Параллельный Кот
1905 / 827 / 350
Регистрация: 25.03.2016
Сообщений: 2,045
09.10.2018, 22:39 4
WinAPI без разницы, что там в файле, эти функции будут читать/записывать данные блоками. Т.е. как в бинарном режиме. Бинарный/текстовый режим работы с файлом влияет только на способ обработки управляющих символов.

Набросал небольшой пример. Надеюсь, поможет. А вообще, с этим вопросом лучше было в ветку C++: WinAPI обратиться, там больше специалистов по этой теме обитает.

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
#include <Windows.h>
#include <iostream>
using namespace std;
 
int main()
{
    const char fname[] = "input.txt";
 
    // Открыть существующий файл для чтения.
    HANDLE hFile = CreateFile(
        fname,                      // Имя файла или путь к нему.
        GENERIC_READ,               // Описание доступа, чтение и/или запись.
        FILE_SHARE_READ,            // Общий доступ к файлу: несколько процессов могут выполнять чтение.
        NULL,                       // Аттрибуты безопасности: по умолчанию.
        OPEN_EXISTING,              // Действия для несуществующих файлов: открыть, только если файл существует.
        FILE_ATTRIBUTE_NORMAL,      // Аттрибуты файла: обычный файл.
        NULL);                      // Аттрибуты template не указаны.
    
    // Проверка открытия файла.
    if (hFile == INVALID_HANDLE_VALUE) {
        cout << "The file has not been opened." << endl;
        return 1;
    }
 
    // Получить размер файла.
    size_t file_size = GetFileSize(
        hFile,                      // Дескриптор открытого файла.
        NULL);                      // Старшая часть размера файла. Для файлов до 4Гб не требуется.
 
    cout << "File size: " << file_size << endl;
 
    DWORD read_length = 0;
    char *buf = new char[file_size];
 
    ReadFile(
        hFile,                      // Дескриптор открытого файла.
        buf,                        // Буфер для чтения.
        file_size,                  // Количество байт для чтения из файла.
        &read_length,               // Фактически прочитано байт.
        NULL);                      // Указатель на структуру OVERLAPPED, если файл открыт с флагом FILE_FLAG_OVERLAPPED.
 
    cout << "Read bytes: " << read_length << endl;
    cout << endl;
 
    for (int i = 0; i < read_length; i++) {
        cout << buf[i];
    }
 
    // Закрыть файл.
    CloseHandle(hFile);
 
    delete[] buf;
 
    return 0;
}
Подробнее о работе с функциями лучше читать в документации от MS: CreateFileA, GetFileSize, ReadFile, CloseHandle.
0
09.10.2018, 22:39
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
09.10.2018, 22:39
Помогаю со студенческими работами здесь

Как открыть файл в 16 виде
Как открыть файл в шестнадцятиричном виде? Добавлено через 8 минут Вернее посмотреть даные...

Как открыть файл в виде набора символов?
Ну никак не могу понять как открыть файл любого типа(не только тхт) в виде текста(имею в виду набор...

Открыть ftp.exe, открыть соединение с FTP-сервером, залогиниться, загрузить файл в бинарном режиме и выйти
С помощью .bat мне нужно открыть ftp.exe, открыть соединение с ftp сервером, залогиниться, залить...

Как считать файл в бинарном виде?
как считать абсолютно любой файл в бинарном виде (в виде двоичного кода) и записать эти данные,...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru