Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
2 / 2 / 0
Регистрация: 17.06.2010
Сообщений: 38

Чтение из двоичного файла

09.07.2010, 19:29. Показов 2621. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Помогите пожалуйста. Проблема такая:
В двоичном файле дан массив. нужно прочитать его и скопировать в текстовый файл. Считать у меня вроде получается, а вот записать из памяти в текстовик - никак, пишет туда нули почемуто.
Код нужен?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
09.07.2010, 19:29
Ответы с готовыми решениями:

Преобразование текстового файла в двоичный и чтение исходных данных из двоичного файла.
#include<iostream> #include<fstream> #include<locale.h> #include<iomanip> #include <cstdlib> using namespace std; struct...

Чтение двоичного файла
Есть файл, без типа,просто файл. Содержит набор чисел (размером по 4 б - int ) нужно его прочитать. Пишу: FILE *fp; if ((fp =...

Запись и чтение из двоичного файла
Программа должна считать из текстового файла массив и размерность, далее записать это все в двоичный файл и посчитать сумму между...

12
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
09.07.2010, 19:51
Цитата Сообщение от IMD Посмотреть сообщение
Код нужен?
Нет, зачем? На форуме полно медиумов.
1
2 / 2 / 0
Регистрация: 17.06.2010
Сообщений: 38
09.07.2010, 21:18  [ТС]
Тогда уточню задачу. Вот код, формирующий бинарник с массивами случайных действ. чисел (вводим число массивов и их размер):
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
using namespace std;
 
int main()
{
setlocale(LC_ALL,"Rus");
FILE *out;
out=fopen("mass1.dat","wb");
        float arr[200][200];
        int i,j,n,number,l,h;
        cout<<"Сколько нужно массивов?\n";
        cin>>number;
        cout<<"Кол-во строк в массиве?\n";
        cin>>h;
        cout<<"Кол-во столбцов в массиве?\n";
        cin>>l;
              for (n=1;n<=number;n++)
                 {
                  cout<<"Массив №"<<n<<":\n";
                  printf("\n"); 
                     for(i=1;i<=h;i++)
                     {
                          for(j=1;j<=l;j++)
                           {
                             arr[i][j]=(rand()%100+(0.1*rand()));
                             printf("%f\t",arr[i][j]);
                             fwrite(&arr[i][j], sizeof(arr[i][j]), 1,out);
 
                           }
                          printf("\n");
                        }
                     printf("\n");
                     }
              cin>>i;
fclose(out);
}
Помогите хотябы считать массивы из бинарника в текстовый файл, вот мой код:
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
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
using namespace std;
 
int main()
{
    setlocale(LC_ALL,"Rus");
    char name[20];
    char b[2000];
    int i,j,n1,n2,n=1,l,h,l1=0,h1=0,numb1,numb2=200,t=0,number;
    FILE *in,*out;
    if ((out=fopen("mass1.dat", "rb"))==NULL)
    {
        printf("Файл не читается.\n"); 
        return 1; 
    }
    out=fopen("mass1.dat", "rb");
    in=fopen("mass2.txt", "wt");
    cout<<"Файл успешно открыт\n";
    for (i=0;i<=numb2;i++)
        fread(&b[i],sizeof(float),1,out);
        fprintf(in,"%d",b[i]);
        cin>>i;
    
}
А вообще нужно считать массивы из бинарника и записать в новый текстовый файл массивы с номерами из указанного с клавиатуры диапазона, хотя с этим я какраз почти разобрался.
0
146 / 146 / 32
Регистрация: 26.10.2008
Сообщений: 782
09.07.2010, 21:27
Цитата Сообщение от IMD Посмотреть сообщение
if ((out=fopen("mass1.dat", "rb"))==NULL)
{
printf("Файл не читается.\n");
return 1;
}
out=fopen("mass1.dat", "rb");
А зачем повторно открывать файл?
Весь код не смотрел, но это вызывает вопросы.
0
2 / 2 / 0
Регистрация: 17.06.2010
Сообщений: 38
09.07.2010, 22:18  [ТС]
Ой, это случайно, забыл убрать. Но это вроде бы не критично.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
10.07.2010, 00:04
IMD, Ваш код не смотрел, сделал по-своему...
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
56
57
58
59
60
61
62
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
 
/* Создаёт массив заданного размера, заполняет его случайными числами и записывает в двоичный файл. 
В начале файла указывается количество строк и столбцов */
 
int main(void){
    char buf[BUFSIZ];
    int rows, columns, **matrix, i, j;
    FILE * f;
    
    printf("Rows: ");
    scanf("%d", &rows);
    printf("Columns: ");
    scanf("%d%*c", &columns);
    
    srand(time(NULL));
    printf("Matrix:\n");
    if ( ( matrix = (int**)calloc(rows, sizeof(int*)) ) == NULL ){
        fprintf(stderr, "Memory error!\n");
        exit(EXIT_FAILURE);
    }
    for ( i = 0; i < rows; ++i ){
        if ( ( matrix[i] = (int*)calloc(columns, sizeof(int)) ) == NULL ){
            fprintf(stderr, "Memory error!\n");
            exit(EXIT_FAILURE);
        }
        for ( j = 0; j < columns; ++j )
            printf("%02d ", ( matrix[i][j] = rand() % 100 ));
        printf("\n");
    }
    
    printf("\nName for output file: ");
    scanf("%s", buf);
    if ( ( f = fopen(buf, "wb") ) == NULL ){
        fprintf(stderr, "Can't open file % s for output!\n", buf);
        exit(EXIT_FAILURE);
    }
    
    if ( fwrite(&rows, sizeof(int), 1, f) != 1 ){
        fprintf(stderr, "Can't write to output file!\n");
        exit(EXIT_FAILURE);
    }
    if ( fwrite(&columns, sizeof(int), 1, f) != 1 ){
        fprintf(stderr, "Can't write to output file!\n");
        exit(EXIT_FAILURE);
    }
    for ( i = 0; i < rows; ++i ){
        if ( fwrite(matrix[i], sizeof(int), columns, f) != columns ){
            fprintf(stderr, "Can't write to output file!\n");
            exit(EXIT_FAILURE);
        }
    }
    fclose(f);
    for ( i = 0; i < rows; ++i )
        free(matrix[i]);
    free(matrix);
    
    printf("done.\n");
    exit(EXIT_SUCCESS);
}
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
56
#include <stdio.h>
#include <stdlib.h>
 
/* Читает матрицу из указанного двоичного файла и пишет в указанный текстовый */
 
int main(void){
    char fin_name[BUFSIZ], fout_name[BUFSIZ];
    FILE * fin, * fout;
    int * arr, i, j, rows, columns;
    
    printf("Input file: ");
    scanf("%s", fin_name);
    printf("Output name: ");
    scanf("%s", fout_name);
    
    if ( ( fin = fopen(fin_name, "rb") ) == NULL ){
        fprintf(stderr, "Can't open file %s for input!\n", fin_name);
        exit(EXIT_FAILURE);
    }
    if ( ( fout = fopen(fout_name, "w") ) == NULL ){
        fprintf(stderr, "Can't open file %s for output!\n", fout_name);
        exit(EXIT_FAILURE);
    }
    
    if ( fread(&rows, sizeof(int), 1, fin) != 1 ){
        fprintf(stderr, "Can't read from input file!\n");
        exit(EXIT_FAILURE);
    }
    if ( fread(&columns, sizeof(int), 1, fin) != 1 ){
        fprintf(stderr, "Can't read from input file!\n");
        exit(EXIT_FAILURE);
    }
    if ( ( arr = (int*)calloc(columns, sizeof(int)) ) == NULL ){
        fprintf(stderr, "Memory error!\n");
        exit(EXIT_FAILURE);
    }
    for ( i = 0; i < rows; ++i ){
        if ( fread(arr, sizeof(int), columns, fin) != columns ){
            fprintf(stderr, "Unexpected end of file!\n");
            exit(EXIT_FAILURE);
        }
        for ( j = 0; j < columns; ++j ){
            if ( fprintf(fout, "%02d%c", arr[j], ( j < columns - 1 ) ? ' ' : '\n') < 0 ){
                fprintf(stderr, "Can't write to output file!\n");
                exit(EXIT_FAILURE);
            }
        }
    }
    
    fclose(fin);
    fclose(fout);
    free(arr);
    
    printf("done.\n");
    exit(EXIT_SUCCESS);
}
0
2 / 2 / 0
Регистрация: 17.06.2010
Сообщений: 38
10.07.2010, 11:29  [ТС]
easybuddaСпасибо огромное, очень помогли

Добавлено через 3 часа 39 минут
А можно сделать так чтобы он в файл вносил несколько матриц? И читал потом ту матрицу, номер которой с клавиатуры введен.
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
10.07.2010, 11:38
Цитата Сообщение от IMD Посмотреть сообщение
А можно сделать так чтобы он в файл вносил несколько матриц? И читал потом ту матрицу, номер которой с клавиатуры введен.
Можно, но замороченно. Если нужно добраться до второй матрицы - открываете файл, читаете значения rows & columns от первой
C
1
2
3
4
5
6
7
8
        if ( fread(&rows, sizeof(int), 1, fin) != 1 ){
                fprintf(stderr, "Can't read from input file!\n");
                exit(EXIT_FAILURE);
        }
        if ( fread(&columns, sizeof(int), 1, fin) != 1 ){
                fprintf(stderr, "Can't read from input file!\n");
                exit(EXIT_FAILURE);
        }
а дальше
C
1
fseek(fin, rows * columns * sizeof(int), SEEK_CUR);
снова читаете rows и columns но уже для второй матрицы, а потом считываете её точно так же, как у меня в примере...
0
2 / 2 / 0
Регистрация: 17.06.2010
Сообщений: 38
10.07.2010, 12:03  [ТС]
Ещё раз спасибо, очень помогли.
0
2 / 2 / 0
Регистрация: 17.06.2010
Сообщений: 38
12.07.2010, 23:38  [ТС]
И ещё последний вопросик:
Вот я додлелал программы, теперь первая создает двоичный файл с несколькими массивами, а вторая читает массивы с номерами из заданного диапазона. И вот почему-то когда она их читает, появляется совершенно лишний файл, пустой и с непонятным названием. Вот сами смотрите.
Эта программа формирует файл с массивами:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <locale.h>
 
 
 
int main(void)
{
        setlocale(LC_ALL,"Rus");
        char name[20];
        int number, rows, columns, **massiv, n, i, j;
 
        FILE *file;
        
        printf("Введите число массивов: ");
        scanf("%d", &number);
        printf("Введите число строк: ");
        scanf("%d", &rows);
        printf("Введите число столбцов: ");
        scanf("%d%*c", &columns);
        printf("\nВведите имя файла: ");
        scanf("%s", name);
       
        
        
        srand(time(NULL));
        if ( ( massiv = (int**)calloc(rows, sizeof(int*)) ) == NULL )
        { 
            fprintf(stderr, "Memory error!\n");       
        }
        if ( ( file=fopen (name, "wb") ) == NULL )
        {
            fprintf(stderr, "Can't open file %s for input!\n", name);                
        }
        
 
        for (n=1;n<=number;n++)
        {
            printf("Массив №%d",n);
            printf("\n");
            fwrite (&n, sizeof(int), 1, file);
            for ( i = 0; i < rows; i++ )
                {
                    if ( ( massiv[i] = (int*)calloc(columns, sizeof(int)) ) == NULL )
                    {
                        fprintf(stderr, "Memory error!\n");
                        
                    }
                        for ( j = 0; j < columns; j++ )
                        printf("%02d ", ( massiv[i][j] = rand() % 100 ));
                        printf("\n");
                        
                }
                
                
                if ( fwrite(&rows, sizeof(int), 1, file) != 1 )
                {
                    fprintf(stderr, "Can't write to output file!\n");                
                }
                if ( fwrite(&columns, sizeof(int), 1, file) != 1 )
                {
                    fprintf(stderr, "Can't write to output file!\n");
                }
                    for ( i = 0; i < rows; i++ )
                    {
                        if ( fwrite(massiv[i], sizeof(int), columns, file) != columns )
                        {
                                fprintf(stderr, "Can't write to output file!\n");                       
                        }
                }        
            printf("Массив записан.\n");
        }
 
 
        fclose (file);
        scanf("%s", name);
}
А эта переписывает нужные массивы в другие файлы:
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
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <locale.h>
 
 
int main(void)
{
        setlocale(LC_ALL,"Rus");
        FILE * fin, * fout;
        char fin_name[20], fout_name[20];
        int i, j, * arr, rows, columns, n;
        int n1, n2;
        
        printf("Введите имя читаемого файла: ");
        scanf("%s", fin_name);
        printf("Введите номер первого массива: ");
        scanf("%d", &n1);
        printf("Введите номер последнего массива: ");
        scanf("%d", &n2);
        
              
        if ( ( fin = fopen(fin_name, "rb") ) == NULL )
        {
                fprintf(stderr, "Can't open file %s for input!\n", fin_name);                
        }
        if ( ( fout = fopen(fout_name, "wt") ) == NULL ){
                fprintf(stderr, "Can't open file %s for output!\n", fout_name);              
        }
 
                for (n=1;n<=n2;n++)
                {
                    if ( fread(&n, sizeof(int), 1, fin) != 1 )
                    {
                            fprintf(stderr, "Can't read from input file!\n");                
                    }
                    if ( fread(&rows, sizeof(int), 1, fin) != 1 )
                    {
                            fprintf(stderr, "Can't read from input file!\n");                
                    }
                    if ( fread(&columns, sizeof(int), 1, fin) != 1 )
                    {
                            fprintf(stderr, "Can't read from input file!\n");                
                    }
                            
 
                    if ( ( arr = (int*)calloc(columns, sizeof(int)) ) == NULL )
                    {
                            fprintf(stderr, "Memory error!\n");                
                    }
                    if (n<n1)
                    {
                        fseek(fin, rows * columns * sizeof(int), SEEK_CUR);
                    }
                    else
                    {
                    printf("Введите имя записываемого файла: ");
                    scanf("%s", fout_name);
                    fout = fopen(fout_name, "wt");                      
                
                        for ( i = 0; i < rows; i++)
                        {
                                
                                if ( fread(arr, sizeof(int), columns, fin) != columns)
                                {
                                        fprintf(stderr, "Unexpected end of file!\n");
                                      
                                }
                                for ( j = 0; j < columns; j++ )
                                {
                                        
                                        if ( fprintf(fout, "%02d%c", arr[j], ( j < columns - 1 ) ? ' ' : '\n') < 0 )
                                        {
                                                fprintf(stderr, "Can't write to output file!\n");                                
                                        }
                                }
                        }
                    }
                }
fclose(fin);
fclose(fout);
printf("done.\n");
scanf("%s", fout_name);
}
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
12.07.2010, 23:54
IMD, у Вас выходной файл аж два раза создаётся ( в 28 и 60 строке ) - явно что-то не так, как задумано... И ещё. Если файл открыть не удалось, мало по этому поводу просто выругаться, программа должна завершиться с ошибкой, иначе не понятно, откуда она будет читать, или куда писать данные...
1
12.07.2010, 23:57

Не по теме:

easybudda, мало по этому поводу просто выругаться
Порадовало

0
2 / 2 / 0
Регистрация: 17.06.2010
Сообщений: 38
13.07.2010, 08:50  [ТС]
easybudda О, с повторным объявлением уже второй раз ошибаюсь. Спасибо что напомнили.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
13.07.2010, 08:50
Помогаю со студенческими работами здесь

Чтение из двоичного файла в массива структур
У меня есть класса user со структурой info class user { public: struct info { std::string login; std::string...

Чтение двоичного файла для последующей расшифровки DPAPI
Здравствуйте! Уже достаточно долго пытаюсь расшифровать зашифрованный с помощью DPAPI файл. Зашифровать проблем не составляет, а вот с...

Чтение двоичного файла и занесение данных в массив структур
/*чтение двоичного файла и занесение данных в массив S (кото- рый объявлен как указатель на тип Stud)*/ bool read_file(FILE * f,...

В начало двоичного файла целого типа дописать нечетные элементы этого файла.
Вот прога для записи четных файлов...в конец Мне нужно в начало....нечетные...помогите разобраться как сделать!!!:drink: #include...

Раскодировка двоичного файла
Всем доброго времени суток. В общем у меня есть двоичный файл который содержит в себе сжатую информацию(сжатие делал методом Хаффмана) и...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
YAFU@home — распределённые вычисления для математики. На CPU
Programma_Boinc 20.01.2026
YAFU@home — распределённые вычисления для математики. На CPU YAFU@home — это BOINC-проект, который занимается факторизацией больших чисел и исследованием aliquot-последовательностей. Звучит. . .
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит: токи, напряжения и их 1 и 2 производные при t = 0;. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
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. Программа предоставляет более. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru