Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
#1

Строки и бинарные файлы - C++

24.01.2012, 00:21. Просмотров 463. Ответов 6
Метки нет (Все метки)

Программа читает из бинарного файла и выводит содержимое на экран. Потом можно добавить 1 элемент в любую ячейку.
Проблема в том, что при выводе на экран, оно выводит 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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include<stdio.h>
#include<stdlib.h>
                                                            // Функции
int getFileSize(FILE *f);
int getElementAtPosition(int ,FILE* );
void setFileElements(int ,char ,FILE* );
void print_file(FILE *f);
                                                            // main
void main()
{
    FILE *f1;
    int n1;
    char n[11];
    if(!(f1=fopen("mychisla.bin","r+b")))
    {
        puts("can't create file");
        exit(0);
    }
    puts("\Soderzanie faila:");
    print_file(f1);
 
    puts("\nKolichestvo elementov:");
    printf("%d\n",getFileSize(f1));
 
    puts("\nVvedite element kotorii hotite pomestit v file: ");
    scanf("%s",&n);
 
    puts("\nVvedite kuda vstavit element: ");
    scanf("%d",&n1);
 
    setFileElements(n1,*n,f1);
    puts("\nSOderzanie faila:");
    
    print_file(f1);
    fclose(f1);
}
                                                            //Get file size
int getFileSize(FILE *f)
{
    fseek(f,0* sizeof(char),SEEK_END);
    int n=ftell(f)/sizeof(char);
    printf("ftell=%d\n",n);
    return n;
}
                                                            // Position
int getFileAtPosition(int i,FILE *f)
{
    int buf;
    fseek(f,i*sizeof(int),SEEK_SET);
    fread(&buf, sizeof(int),1,f);
 
    return buf;
}
                                                            // Printf file
void print_file(FILE*f)
{
    int n=getFileSize(f);
    fseek(f,0*sizeof(char),SEEK_SET);
 
    for(int i=0;i<n;i++)
    {
        char x[11];
        if(!fread(&x,sizeof(char),1,f)) break;
        printf("element #%d=%s\n",i,x);
    }
}
                                                            // set file elements
void setFileElements(int pos,char element,FILE*f)
{
    fseek(f,pos*sizeof(char),SEEK_SET);
    fwrite(&element, sizeof(char),1,f);
}
Добавлено через 8 часов 40 минут
Неужели это всё так сложно_О
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2012, 00:21
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Строки и бинарные файлы (C++):

Бинарные файлы - C++
Ребята у вас есть какие та примеры программок работы с бинарными файлами, к примеры поменять местами максимальные и минимальные значения...

Бинарные файлы - C++
Нужна помощь Во время работы программы если взять много значений программа вылетает. Уже все перепробывал. не знаю что делать ...

Бинарные файлы - C++
как в бинарном файле заменить 4, 8 и 10 байт

бинарные файлы - C++
доброго времени суток. очень нужна помощь по нескоьким задачам. именно помощь, а не решение за меня) спасибо, если кто откликнется. ...

Бинарные файлы - C++
1.Записать в файл N действительных чисел a1, a2, …,an. Организовать новый файл , элементы которого вычисляются по формуле:...

Бинарные файлы - C++
Ребята, нужна Ваша помощь. Как реализовать вот эту штуку ? Буду признателен за любые идеи В первом файле хранится k матриц из n строк...

6
NoMasters
Псевдослучайный
1906 / 1117 / 77
Регистрация: 13.09.2011
Сообщений: 3,169
24.01.2012, 00:34 #2
У тебя формат %s, а вывести надо только один символ. %c же //зачем х вообще массив?
0
retmas
Жарю без масла
864 / 746 / 168
Регистрация: 13.01.2012
Сообщений: 1,702
24.01.2012, 00:38 #3
ошибка у вас тут:
Цитата Сообщение от AfoTax Посмотреть сообщение
C++
1
2
3
                char x[11];
                if(!fread(&x,sizeof(char),1,f)) break;
                printf("element #%d=%s\n",i,x);
подумайте, куда вы вводите.
да и что выводите
0
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
24.01.2012, 01:52  [ТС] #4
Цитата Сообщение от NoMasters Посмотреть сообщение
У тебя формат %s, а вывести надо только один символ. %c же //зачем х вообще массив?
Мне нужно вводить и выводить не по 1 символу, а целой строкой.
0
NoMasters
Псевдослучайный
1906 / 1117 / 77
Регистрация: 13.09.2011
Сообщений: 3,169
24.01.2012, 01:58 #5
тогда выкинь свой цикл и читай сколько надо сразу, а потом руками ставь завершающий строку нулевой символ.
0
AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
24.01.2012, 02:03  [ТС] #6
Извиняюсь за неточные данные. Забыл что программа для первичного создания и ввода файла у меня была отдельно =)
Вот исправленный код:
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
85
86
87
88
89
90
91
92
93
94
#include<stdio.h>
#include<stdlib.h>
                                                            // Функции
int getFileSize(FILE *);
int getElementAtPosition(int ,FILE* );
void setFileElements(int ,char* ,FILE* );
void print_file(FILE *f);
void create(void);
                                                            // main
void main()
{
    create();
    FILE *f1;
    int n1;
    char n[11];
    if(!(f1=fopen("mychisla.bin","r+b")))
    {
        puts("can't create file");
        exit(0);
    }
    puts("\Soderzanie faila:");
    print_file(f1);
 
    puts("\nKolichestvo elementov:");
    printf("%d\n",getFileSize(f1));
 
    puts("\nVvedite element kotorii hotite pomestit v file: ");
    scanf("%s",&n);
    
    puts("\nVvedite kuda vstavit element: ");
    scanf("%d",&n1);
 
    setFileElements(n1,&n[0],f1);
    puts("\nSOderzanie faila:");
    
    print_file(f1);
    fclose(f1);
}
void create(void)
{
    FILE *k;
    if(!(k=fopen("mychisla.bin","wb")))
    {
        puts("Error\n");
        exit(0);
    }
    char name[22];
    printf("enter str\n");
    scanf("%s",name);
    while(!feof(stdin))
    {
        fwrite(&name,sizeof(char),1,k);
 
        printf("enter str\n");
        scanf("%s",name);
    }
    fclose(k);
}
                                                            //Get file size
int getFileSize(FILE *f)
{
    fseek(f,0* sizeof(char),SEEK_END);
    int n=ftell(f)/sizeof(char);
    printf("ftell=%d\n",n);
    return n;
}
                                                            // Position
int getElementAtPosition(int i,FILE *f)
{
    int buf;
    fseek(f,i*sizeof(int),SEEK_SET);
    fread(&buf, sizeof(int),1,f);
 
    return buf;
}
                                                            // Printf file
void print_file(FILE*f)
{
    int n=getFileSize(f);
    fseek(f,0*sizeof(char),SEEK_SET);
 
    for(int i=0;i<n;i++)
    {
        char x[11];
        if(!fread(&x,sizeof(char),1,f)) break;
        printf("element #%d=%s\n",i,x);
    }
}
                                                            // set file elements
void setFileElements(int pos,char* element,FILE*f)
{
    fseek(f,pos*sizeof(char),SEEK_SET);
    fwrite(element, sizeof(char),1,f);
}
Добавлено через 3 минуты
Цитата Сообщение от NoMasters Посмотреть сообщение
тогда выкинь свой цикл и читай сколько надо сразу, а потом руками ставь завершающий строку нулевой символ.
Неполучится =( Это часть моего проекта к зачету в универе) Надо чтобы всё было правильно)
0
NoMasters
Псевдослучайный
1906 / 1117 / 77
Регистрация: 13.09.2011
Сообщений: 3,169
24.01.2012, 02:05 #7
Ответ не изменился. Ты читаешь по одному символу в x[0] и пытаешься вывести массив как строку. При этом завершающего нуля в нём нет.
1
24.01.2012, 02:05
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2012, 02:05
Привет! Вот еще темы с ответами:

С++ бинарные файлы - C++
Вот мой чудо-код, но он походу только *.txt файлы открывает, а мне нужно что бы и бинарные тоже. Прошу помощи!!! #include &quot;stdafx.h&quot; ...

Бинарные файлы - C++
Заполнить бинарный файл случайными числами. Найтим min значение (их может быть несколько) и заменить min значение нулями

Бинарные файлы в С++ - C++
У меня есть програмка которая находит наименьший общий делитель числа#include&lt;iostream&gt; using namespace std; int main() { int n; ...

Бинарные файлы.. - C++
Доброго времени суток, господа! Возникла проблемка с открытием бинарного файла: char stroka; fstream bin_file; ...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru