Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/40: Рейтинг темы: голосов - 40, средняя оценка - 4.55
 Аватар для astonone
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 17

Чтение из бинарного файла и преобразование строк в int

22.12.2014, 18:12. Показов 8237. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток, столкнулся с такой вот проблемой.
У меня есть бинарный файл со следующей структурой:
N - число эл-тов одномерного целочисленного массива, 0<N<=500, далее непосредственно записаны сами эл-ты,значения которых лежат в диапазоне [-100;100].

Я считываю содержимое файла в массив типа *char;
Считывается все корректно, но есть одно но
Мне нужно преобразовать строки из этого массива в тип int для того чтобы можно было работать с этим массивом.
вот код, сутки уже бьюсь и результаты особо не впечатляют

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
#include <iostream>
#include <fstream>
 
using namespace std;
 
int main()
{
ifstream file ("data_1", std::ifstream::binary);
    if (file) 
    {
        // Получаем длину файла:
        file.seekg (0, file.end);
        int length = file.tellg();
        file.seekg (0, file.beg);
 
        char *buf = new char [length];
                int i=0;int Arrlen;
        int *_Arr;
        char tmp[4] = {    };
 
        file.read (buf,length);
        Arrlen = atoi(buf);
        _Arr = new int [Arrlen+1];
 
        while(i<Arrlen+1)
        {
            file.read(buf,4);
            cout<<tmp;
            //_Arr[i] = atoi(tmp);
            i++;
        }
        file.close();
        delete[] buf;
                cout<<_Arr[i]<<endl;
        
        delete[] _Arr;
 
    }
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
22.12.2014, 18:12
Ответы с готовыми решениями:

Чтение строк из бинарного файла.
Вот как происходит запись строк pr.login и pr.password: FILE *f; f=fopen(path,&quot;ab&quot;); if (f!=NULL) { cout&lt;&lt;&quot;Файл...

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

Чтение нескольких структур и одной переменной из бинарного файла. Формат файла имеется
Формат файла состоит из 3 структур и одной переменной. Подробное описание формата во вложении, просьба посмотреть его. У меня возникла...

14
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.12.2014, 18:43
А зачем ты читаешь char? Сразу читай в массив целых элементов подходящего размера.
0
 Аватар для astonone
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 17
22.12.2014, 20:39  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
А зачем ты читаешь char? Сразу читай в массив целых элементов подходящего размера.
это как? можете привести пример кода?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.12.2014, 21:34
Если файл именно бинарный, а не текстовый, то, например, для целых типа int (4 байта):
C++
1
2
3
4
int length;
        file.read ((char *)&length, 4); // количество элементов
        int *buf = new int [length];
        file.read ((char *)buf, length * 4); // содержимое
Если всё таки файл текстовый, тогда и читать надо соответственно.
1
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
22.12.2014, 22:10
Цитата Сообщение от nmcf Посмотреть сообщение
типа int (4 байта):
не стоит всё же опираться на магические константы, лучше использовать оператор sizeof.
А для кроссплатформенности вместо int использовать int32_t, скажем.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.12.2014, 23:11
Ну допиливание никто не отменял. И в данном случае дело не в sizeof, а в том, сколько байт на число в самом файле. Под это и надо подбирать тип.
0
 Аватар для astonone
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 17
23.12.2014, 07:52  [ТС]
Попробовал сделать так как вы посоветовали, но есть проблемка, код компилится,но как только появляется окно консоли программа падает с ошибкой, пишет что-то вроде "bad_alloc at memory location" и если я правильно понял то падает на строке :
C++
1
 int *buf = new int [length];
.

Вот мой код,может я где накосячил?
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
#include"CL_Array.h"
#include"CL_Random.h"
#include <locale.h>
#include <iostream>
#include <fstream>
 
using namespace std;
 
 
int main()
{
    setlocale( LC_ALL, "Russian");
    
    ifstream file ("data_1", std::ifstream::binary);
    if (file) 
    {
        int length;
        file.read ((char *)&length, sizeof(int)); // количество элементов
        int *buf = new int [length];
        file.read ((char *)buf, length * sizeof(int)); // содержимое
 
        for(int i=0;i<length;i++)
            cout<<buf[i]<<endl;
 
        file.close();
        delete[] buf;
    }
    /*
    int N,MAX,Pr;
    cout<<" Введите размер массива N = : ";
    scanf("%d",&N);
 
    Array Arr(N);
 
    Arr.Display();
 
    MAX = Arr.ArrMaxEl();
    cout<<" Максимальный элемент массива : "<<MAX<<endl;
 
    Pr = Arr.Product();
    cout<<" Произведение эл-тов между максимальным и минимальным : "<<Pr<<endl;
 
    //Arr = &Arr;
    //Arr.Display();
 
    */
    system("pause");
    return 0;
}
0
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.12.2014, 08:06
Цитата Сообщение от astonone Посмотреть сообщение
Я считываю содержимое файла в массив типа *char;
Считывается все корректно, но есть одно но
Мне нужно преобразовать строки из этого массива в тип int для того чтобы можно было работать с этим массивом.
Не нужно. Так как файл бинарный, то ни каких чаров, тем более строк в нём нет.

Добавлено через 2 минуты
Цитата Сообщение от astonone Посмотреть сообщение
Попробовал сделать так как вы посоветовали, но есть проблемка, код компилится,но как только появляется окно консоли программа падает с ошибкой, пишет что-то вроде "bad_alloc at memory location" и если я правильно понял то падает на строке :
C++
1
int *buf = new int [length];
А дебажить пробовал?
1
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 10:51
Лучший ответ Сообщение было отмечено astonone как решение

Решение

Значит, нужно не int, а, возможно, short int. В файле сколькими байтами каждое число представлено?
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.12.2014, 11:14
Лучший ответ Сообщение было отмечено astonone как решение

Решение

И вообще спецификацию формата в студию.
1
 Аватар для astonone
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 17
23.12.2014, 12:28  [ТС]
В общем, кажется я догадываюсь в чем проблема, я бинарник создал, просто копируя туда цифры из другого текстового файла:
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
#include <fstream>      // std::ifstream, std::ofstream
 
int main () 
{
 
  std::ifstream infile ("test.txt",std::ifstream::binary);
  std::ofstream outfile ("data_1",std::ofstream::binary);
 
  // Получаем размер файла
  infile.seekg (0,infile.end);
  int size = infile.tellg();
  infile.seekg (0);
 
  // Выделяем память для содержимого файла
  char* buffer = new char[size];
 
  // Считываем содержимое infile
  infile.read (buffer,size);
 
  // Записываем содержимое в outfile
  outfile.write (buffer,size);
 
  // Чистим память
  delete[] buffer;
 
  outfile.close();
  infile.close();
  return 0;
 
}
в txt-шнике лежали цифры:
5
8
3

и после этого использую файл "data_1" вот в своей программе:
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
#include"CL_Array.h"
#include"CL_Random.h"
#include <locale.h>
#include <iostream>
#include <fstream>
 
using namespace std;
 
 
int main()
{
    setlocale( LC_ALL, "Russian");
    
    ifstream file ("data_1", std::ifstream::binary);
    if (file) 
    {
        int length;
        file.read ((char *)&length, sizeof(int)); // количество элементов
        int *buf = new int [length];
        file.read ((char *)buf, length * sizeof(int)); // содержимое
 
        for(int i=0;i<length;i++)
            cout<<buf[i]<<endl;
 
        file.close();
        delete[] buf;
    }
    /*
    int N,MAX,Pr;
    cout<<" Введите размер массива N = : ";
    scanf("%d",&N);
 
    Array Arr(N);
 
    Arr.Display();
 
    MAX = Arr.ArrMaxEl();
    cout<<" Максимальный элемент массива : "<<MAX<<endl;
 
    Pr = Arr.Product();
    cout<<" Произведение эл-тов между максимальным и минимальным : "<<Pr<<endl;
 
    //Arr = &Arr;
    //Arr.Display();
 
    */
    system("pause");
    return 0;
}
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
23.12.2014, 12:32
Значит у тебя текстовый файл. Читай его как текст.
1
 Аватар для taras atavin
4226 / 1796 / 211
Регистрация: 24.11.2009
Сообщений: 27,562
23.12.2014, 12:45
Цитата Сообщение от astonone Посмотреть сообщение
В общем, кажется я догадываюсь в чем проблема, я бинарник создал, просто копируя туда цифры из другого текстового файла:
Бинарники так не создаются, это текстовый файл.
1
 Аватар для astonone
0 / 0 / 0
Регистрация: 29.03.2014
Сообщений: 17
23.12.2014, 12:48  [ТС]
Всем спасибо за помощь)разобрался)создал бинарник так как нужно и теперь все работает)
0
4 / 3 / 1
Регистрация: 02.11.2018
Сообщений: 17
28.11.2018, 15:05
Видел тут вот такую реализацию "C ++ преобразовать строку байтов в int из файла", может кому пригодится
C++ (Qt)
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main(void){
    char fn[] = "myfile";
    ifstream file;
    file.open(fn, ios::in | ios::binary);
 
    string fbuff = "  ";
    file.read((char *)&fbuff[0], 2);
    cout << "fbuff: " << fbuff << endl;
 
    // works
    string a = "0x0200";
    cout << "a: " << a  << endl;
    cout << "stoi(a): " << stoi(a, nullptr, 16) << endl;
 
    // doesn't work
    string b = "\x02\x00";
    cout << "b: " << b << endl;
    cout << "stoi(b): " << stoi(b, nullptr, 16) << endl;
 
    // doesn't work
    cout << "stoi(fbuff): " << stoi(fbuff, nullptr, 16) << endl;
 
    file.close();
    return(0);
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
28.11.2018, 15:05
Помогаю со студенческими работами здесь

Преобразование int в string и слияние строк
int KeysOfFile+=1; string KeysOfFileS=KeysOfFile; string newNameOfBook=&quot;book&quot;; string ...

Чтение бинарного файла
Подскажите пожалуйста как можно правильно открыть бинарный файл не зная структуры? С чего мне начать? Вот пример:

Чтение из бинарного файла
Здравствуйте. Столкнулся с проблемой, не до конца понимаю от чего она возникает и как решить её. Открываю для чтения файл в бинарном...

Чтение бинарного файла
подскажите пожалуйста как можно из любого файла(*.bmp, *.mp3, *.avi и т.д.) получить двоичное представление этого файла или хотя бы считать...

Чтение из бинарного файла
Создала Базу данных. запись в файл происходит, а чтение из файла не получается. исправьте, пожалуйста, или подскажите как? #include...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11680&amp;d=1772460536 Одним из. . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru