Форум программистов, компьютерный форум, киберфорум
C/С++ под Linux
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.91/11: Рейтинг темы: голосов - 11, средняя оценка - 4.91
54 / 54 / 47
Регистрация: 16.03.2014
Сообщений: 110
Записей в блоге: 2

Запись-считывание строки из бинарного файла

17.03.2014, 04:21. Показов 2068. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача записаить в двоичный файл длину строки и саму строку, а потом считать длину строки и саму строку.

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
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
 
typedef unsigned int unint;
 
int main(int argc, char *argv[]) {
    setlocale(LC_ALL, "ru_RU.UTF-8");
    
    wchar_t *str_a[] = {L"string", L"Фотограф", L"дорога"};
    const unint SIZE = sizeof(str_a) / sizeof(str_a[0]);
    
    wchar_t *str;
    wchar_t buff[125];
    unint len;
    FILE *io;
    
    if((io = fopen("тест.txt", "wb")) == NULL) {
        fprintf(stderr, "Невозможно открыть файл для записи.\n");
        
        exit(1);
    }
    
    // Запись данных в файл
    for(unint count = 0; count < SIZE; ++count) {
        len = wcslen(str_a[count]) + 1;
        if(1 > fwrite((void *)&len, sizeof(unint), 1, io)) {
            fprintf(stderr, "Ошибка при записи в файл размера строки: %u.\n", len);
        }
        
        if(len > fwrite((void *)str_a[count], sizeof(wchar_t), len, io)) {
            fprintf(stderr, "Ошибка при записи в файл строки: %ls.\n", str_a[count]);
        }
    }
    
    if(fclose(io)) {
        fprintf(stderr, "Ошибка при закрытии файла.\n");
    }
    
    if((io = fopen("тест.txt", "rb")) == NULL) {
        fprintf(stderr, "Невозможно открыть файл для чтения.\n");
        
        exit(1);
    }
    
    // Чтение данных из файла
    for(unint count = 0; count  < SIZE; ++count) {
        if(1 > fread((void *)(&len), sizeof(unint), 1, io)) {
            fprintf(stderr, "Ошибка при чтении размера строки: %u.\n", len);
        }
        
        str = (wchar_t *)malloc((sizeof(wchar_t) * len));
        if(str = NULL) {
            fprintf(stderr, "Невозможно выделить память для строки.\n");
        }
        
        if(len > fread((void *)(&str), sizeof(wchar_t), len, io)) {
            fprintf(stderr, "Ошибка при чтении строки.\n");
        }
        
        fprintf(stdout, "Длина строки: %3u; строка: %ls.\n", len, str);
        free(str);
    }
    
    if(fclose(io)) {
        fprintf(stderr, "Ошибка при закрытии файла.\n");
    }
    
    return EXIT_SUCCESS;
}
При выполнении программа выдает сообщение: Ошибка сегментирования.
Если в fread заменить str на buff - все работает нормально. Это странно, т.к. при выделении памяти динамически для чисел (int, double и т.д.) такого не происходит.
Куда копать? А то мысли уже кипят.

PS: gcc версия 4.5.2.
Сборка:
Bash
1
$ gcc -std=c99 -o test main.c
Добавлено через 10 часов 23 минуты
Если создать union, то работает как нужно.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
union STR {
    wchar_t *str1;
    char    *str2;
};
 
 
//...
    union STR st;
//...
        st.str1 = (wchar_t *)malloc(sizeof(wchar_t) * len);
        if(len > fread((void *)st.str2, sizeof(wchar_t), len, io)) {
            fprintf(stderr, "Ошибка при чтении строки.\n");
        }
        
        fprintf(stdout, "Длина строки: %3u; строка: %ls.\n", len, st.str1);
        free(st.str1);
//...
А без union можно обойтись?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
17.03.2014, 04:21
Ответы с готовыми решениями:

Запись и считывание из бинарного файла
Допустим я реализовываю АТД - контейнер. Там будет функция обновления (Все данные скопировать в файл на жестком дискке, а потом обратно)....

Считывание и запись бинарного файла
файл считывается, записывается в массив. Затем создается новый файл, в него записываются данные из массива. Содержимое исходного...

Считывание из бинарного файла и запись данных в две строковых переменные
Мне нужно считать две строки из бинарного файла &quot;input.txt&quot; и запихать их в переменные типа string. Открываю...

2
923 / 639 / 198
Регистрация: 08.09.2013
Сообщений: 1,693
17.03.2014, 13:31
Цитата Сообщение от chjornoe_solnce Посмотреть сообщение
А без union можно обойтись?
Юнион не у дел. Дело в банальной невнимательности.

1.
Цитата Сообщение от chjornoe_solnce Посмотреть сообщение
if(str = NULL) {
результат условия - всегда false, str становится нулем.

2.
Цитата Сообщение от chjornoe_solnce Посмотреть сообщение
if(len > fread((void *)(&str), sizeof(wchar_t), len, io)) {
1
54 / 54 / 47
Регистрация: 16.03.2014
Сообщений: 110
Записей в блоге: 2
17.03.2014, 20:01  [ТС]
Большое спасибо!
Да дело действительно в невнимательности. По правил - теперь работает правильно.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
17.03.2014, 20:01
Помогаю со студенческими работами здесь

Считывание строки из бинарного файла в string
Привет всем!! Помогите новичку понять почему происходит ошибка при считывании строки из файла. void LoadFile() { string j; ...

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

Считывание из бинарного файла
СЧИТАТЬ ИЗ БИНАРНОГО ФАЙЛА ВСЕ ВЕЩЕСТВЕННЫЕ ЧИСЛА В МАССИВ И ВЫВЕСТИ ЕГО НА ЭКРАН. #include &lt;iostream&gt; #include &lt;fstream&gt; ...

Считывание бинарного файла
Здравствуйте! Изначально нужно было прочитать почисленно текстовый файл и забить его в массив. Но т.к. это не получилось, решил прочитать...

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


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
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 Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru