Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
AfoTax
 Аватар для AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
24.01.2012, 00:21     Строки и бинарные файлы #1
Программа читает из бинарного файла и выводит содержимое на экран. Потом можно добавить 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 минут
Неужели это всё так сложно_О
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
24.01.2012, 00:21     Строки и бинарные файлы
Посмотрите здесь:

C++ Бинарные файлы
C++ Бинарные файлы
Бинарные файлы c++ C++
бинарные файлы, C++ C++
бинарные файлы C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
24.01.2012, 00:34     Строки и бинарные файлы #2
У тебя формат %s, а вывести надо только один символ. %c же //зачем х вообще массив?
retmas
Жарю без масла
803 / 685 / 143
Регистрация: 13.01.2012
Сообщений: 1,580
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);
подумайте, куда вы вводите.
да и что выводите
AfoTax
 Аватар для AfoTax
0 / 0 / 0
Регистрация: 05.12.2011
Сообщений: 37
24.01.2012, 01:52  [ТС]     Строки и бинарные файлы #4
Цитата Сообщение от NoMasters Посмотреть сообщение
У тебя формат %s, а вывести надо только один символ. %c же //зачем х вообще массив?
Мне нужно вводить и выводить не по 1 символу, а целой строкой.
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
24.01.2012, 01:58     Строки и бинарные файлы #5
тогда выкинь свой цикл и читай сколько надо сразу, а потом руками ставь завершающий строку нулевой символ.
AfoTax
 Аватар для 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 Посмотреть сообщение
тогда выкинь свой цикл и читай сколько надо сразу, а потом руками ставь завершающий строку нулевой символ.
Неполучится =( Это часть моего проекта к зачету в универе) Надо чтобы всё было правильно)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2012, 02:05     Строки и бинарные файлы
Еще ссылки по теме:

Бинарные файлы C++
C++ Бинарные файлы в С++
C++ Бинарные файлы

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

Или воспользуйтесь поиском по форуму:
NoMasters
Псевдослучайный
1737 / 1080 / 69
Регистрация: 13.09.2011
Сообщений: 3,093
24.01.2012, 02:05     Строки и бинарные файлы #7
Ответ не изменился. Ты читаешь по одному символу в x[0] и пытаешься вывести массив как строку. При этом завершающего нуля в нём нет.
Yandex
Объявления
24.01.2012, 02:05     Строки и бинарные файлы
Ответ Создать тему
Опции темы

Текущее время: 07:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru