Модераторы: bsa

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Сравнить запись в бинарном файле со строкой (СИ) 
V
    Опции темы
Белоснежка
Дата 6.10.2013, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Итак.. В файл было записано с помощью fwrite. Теперь считываю через fread. В char *buffer. Потом делаю strstr(buffer,target_name). И не срабатывает ничего.. Хотя я точно знаю, что есть там таргет_нейм. Проверила что лежит в буффере.. 5 знаков непонятно чего... В чём может быть ошибка? Код выставлю вечером... 
PM MAIL Skype   Вверх
Чупакабро
Дата 6.10.2013, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Написал на С++, не знаю, скомпилируется ли на С
Код

void find(void)
{
    char str[12], buffer[12];
    strcpy(str, "Hello world");
    FILE *file;
    int count;
    count = strlen(str);
    file = fopen("text.txt", "w+t");
    fwrite(str, 1, count, file);
    fclose(file);
    file = fopen("text.txt", "r");
    fread(buffer, 1, count, file);
    fclose(file);
    char *s, s1[6];
    s = strstr(buffer, "world");
    strcpy(s1,s);
    s1[5] = '\0';
    printf("%s", s1);
}

смысл в том, что перед записью нужно открыть файл для записи с параметрами "w+t", после записи закрыть файл, потом открыть его для чтения с параметром "r".

Это сообщение отредактировал(а) Чупакабро - 6.10.2013, 09:53
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Белоснежка
Дата 6.10.2013, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



А что делает т? В си такого нет. Я писала открыв буквами р+б, считывала файл, открытый для р

Добавлено через 10 минут и 59 секунд
Кстати, числа без проблем считываются и они даже читабельны.. Как я их и записывала.. А вот эта строка содержит и числа и стринг.. И выходит кракозябра.. При чём всегда 5 знаков, хотя там уже должно считываться около 300....
PM MAIL Skype   Вверх
Чупакабро
Дата 6.10.2013, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(Белоснежка @  6.10.2013,  11:40 Найти цитируемый пост)
Кстати, числа без проблем считываются и они даже читабельны.. 

Код в студию
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Белоснежка
Дата 6.10.2013, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Цитата(Чупакабро @ 6.10.2013,  12:09)
Цитата(Белоснежка @  6.10.2013,  11:40 Найти цитируемый пост)
Кстати, числа без проблем считываются и они даже читабельны.. 

Код в студию

Запись:
Код

fseek(structure_file,0L,SEEK_END);
            if(fwrite(&target_name,sizeof(target_name),1,structure_file) != 1) //ТУТ!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
                {
                    fclose(store_file);
                    fclose(structure_file);
                    fclose(source_file);
                    free(archive_store);
                    free(archive_structure);
                    printf("Das Schreiben ins VFS war nicht möglich(target_name)\n");
                    return 66;
                }
            char delimiter = ',';
            if(fwrite(&delimiter,sizeof(char),1,structure_file) != 1) //in die structure-Datei Anzahl der freien Blocks schreiben
                {
                    fclose(store_file);
                    fclose(structure_file);
                    fclose(source_file);
                    free(archive_store);
                    free(archive_structure);
                    printf("Das Schreiben ins VFS war nicht möglich(delimiter)\n");
                    return 66;
                }
            if(fwrite(&source_size,sizeof(uintmax_t),1,structure_file) != 1) //in die structure-Datei Anzahl der freien Blocks schreiben
            {
                fclose(store_file);
                fclose(structure_file);
                fclose(source_file);
                free(archive_store);
                free(archive_structure);
                printf("Das Schreiben ins VFS war nicht möglich(source_size)\n");
                return 66;
            }
            if(fwrite(&blockanzahl,sizeof(uintmax_t),1,structure_file) != 1) //in die structure-Datei Anzahl der freien Blocks schreiben
            {
                fclose(store_file);
                fclose(structure_file);
                fclose(source_file);
                free(archive_store);
                free(archive_structure);
                printf("Das Schreiben ins VFS war nicht möglich(source_size)\n");
                return 66;
            }
            for(uintmax_t i=0;i<blockanzahl;i++)
                {
                    if(fwrite(&blocknumber_array[i],sizeof(uintmax_t),1,structure_file) != 1) //in die structure-Datei Anzahl der freien Blocks schreiben
                        {
                            fclose(store_file);
                            fclose(structure_file);
                            fclose(source_file);
                            free(archive_store);
                            free(archive_structure);
                            printf("Das Schreiben ins VFS war nicht möglich(delimiter)\n");
                            return 66;
                        }
                }
            free(archive_store);
            free(archive_structure);
            fclose(store_file);
            fclose(structure_file);
            fclose(source_file);
            printf("Die Datei wurde erfolgreich zum VFS hinzugefügt\n");
            return 0;




Чтение:
Код

                                          uintmax_t aktuelle_position;
            aktuelle_position = ftell(structure_file);
            uintmax_t structure_file_laenge;
            fseek(structure_file,0L,SEEK_END);
            structure_file_laenge = ftell(structure_file);
            fseek(structure_file,aktuelle_position,SEEK_SET);
            uintmax_t zwischen_akt_end;
            zwischen_akt_end = (structure_file_laenge-aktuelle_position);
            printf("%ju,%ju,%ju\n",structure_file_laenge,aktuelle_position,zwischen_akt_end);
            if(zwischen_akt_end != 0)
                {
                    char *buffer = NULL;
                    if((buffer = (char *) malloc(sizeof(char)*zwischen_akt_end)) != NULL)
                        {
                            memset(buffer,0,zwischen_akt_end);
                        }
                    else
                        {
                            fclose(store_file);
                            fclose(structure_file);
                            fclose(source_file);
                            free(buffer);
                            free(archive_store);
                            free(archive_structure);
                            printf("Das Hinzufügen einer Datei hat nicht geklappt\n");
                            return 66;
                        }
                    if((fread(buffer,sizeof(char)*zwischen_akt_end,1,structure_file)) != 1)//-------ТУТ!!!!!!!!!!!!!!!!!!!!!!!!!
                        {
                            fclose(store_file);
                            fclose(structure_file);
                            fclose(source_file);
                            free(buffer);
                            free(archive_store);
                            free(archive_structure);
                            printf("Das Lesen aus der VFS war nicht möglich(dateiinfo)\n");
                            return 66;
                        } printf("%s\n",buffer);
                    if(strstr(buffer,target_name) != NULL) 
                        {
                            fclose(store_file);
                            fclose(structure_file);
                            fclose(source_file);
                            free(buffer);
                            free(archive_store);
                            free(archive_structure);
                            printf("Eine Datei mit diesem Dateinamen existiert bereits\n");
                            return 11;
                        }
                    free(buffer);
                }



Извиняюсь, что не всё.. Код оооочень длинный.. Какие отрезки ещё нужны?
PM MAIL Skype   Вверх
Чупакабро
Дата 6.10.2013, 12:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Ну, судя по приведенному коду, из файла читается строка 
Код

if((fread(buffer,sizeof(char)*zwischen_akt_end,1,structure_file)) != 1)

и выводится именно в формате строки:
Код

printf("%s\n",buffer);

и ищется именно строка
Код

if(strstr(buffer,target_name) != NULL)

Нужен полный код программы, чтобы понять, что в итоге считывается, потому что чтение начинается с 
Код

aktuelle_position = ftell(structure_file);

и неизвестно, как мы пришли на эту позицию в файле
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Белоснежка
Дата 6.10.2013, 13:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



эээ... Не знаю что я сделала, но оно заработало.... Спасибо.. 
PM MAIL Skype   Вверх
Чупакабро
Дата 6.10.2013, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(Белоснежка @  6.10.2013,  13:19 Найти цитируемый пост)
эээ... Не знаю что я сделала, но оно заработало.... Спасибо..  

Поздравляю ))) Ну, программа-то, очевидно, нормально работающая, главное правильно скармливать ей исходные данные.
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Белоснежка
Дата 6.10.2013, 14:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



А сколько нужно резервировать места, если считывается не только чары, но и uintmax_t несколько чисел?
PM MAIL Skype   Вверх
Чупакабро
Дата 6.10.2013, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(Белоснежка @  6.10.2013,  14:48 Найти цитируемый пост)
А сколько нужно резервировать места, если считывается не только чары, но и uintmax_t несколько чисел? 

количество чаров + sizeof(unimax_t) * несколько

--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
akizelokro
Дата 6.10.2013, 16:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


Профиль
Группа: Участник
Сообщений: 761
Регистрация: 30.7.2007

Репутация: 1
Всего: 5



Я запутался в понимании кода. Но функция strstr в общем случае не для сравнения данных, считанных из бинарного файла. 
ЛУчше использовать memcmp


--------------------
a = a + b; b = a - b; a = a - b;
PM MAIL   Вверх
Белоснежка
Дата 6.10.2013, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



А если не сравнивать, можно считанное из бинарного файла привести в читабельный вид?

Уже подумываю сделать всё текстовым файлом, но тогда я не знаю как считывать числа.. ведь я заранее не знаю их длину.. В бинарном проще, я считывала просто sizeof(uintmax_t) количество байтов... Блин.. Всё зря... Можно сдаваться..
PM MAIL Skype   Вверх
Чупакабро
Дата 6.10.2013, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(Белоснежка @  6.10.2013,  17:31 Найти цитируемый пост)
Уже подумываю сделать всё текстовым файлом, но тогда я не знаю как считывать числа.. ведь я заранее не знаю их длину.. В бинарном проще, я считывала просто sizeof(uintmax_t) количество байтов... Блин.. Всё зря... Можно сдаваться.. 

А можно описать полностью задачу? И что в итоге не получилось? Мне кажется, та немецкая копипаста не нужна, все можно сделать проще.
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Белоснежка
Дата 6.10.2013, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 32
Регистрация: 1.11.2010

Репутация: нет
Всего: нет



Это виртуальная файловая система.. Файл, с которым у меня проблемы, организовывает добавление/удаление файлов. Я в него записываю: размер одного блока файловой системы, количество блоков, количество свободных и количество занятых блоков. потом для каждого блока записываю 1 или 0 в зависимости от того занят он или нет. а потом уже идёт информация о файлах, которые уже лежат в файловой системе.. информация выглядит так: длина имени файла, имя файла, размер файла, в скольких блоках он размешён, а потом черечисление блоков, в которых он размещён.. застряла на выяснение, есть ли уже файл с данным названием в файловой системе. для этого мне нужно считать имена файлов и сравнить с данным названием. всё. 

всё это дело я делаю бинарно.


скажите, а если я запишу строку в текстовой файл с fwrite, в файле будет текст или нечитаемые строки?
PM MAIL Skype   Вверх
Чупакабро
Дата 6.10.2013, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 220
Регистрация: 27.2.2007

Репутация: нет
Всего: 4



Цитата(Белоснежка @  6.10.2013,  19:59 Найти цитируемый пост)
скажите, а если я запишу строку в текстовой файл с fwrite, в файле будет текст или нечитаемые строки? 

текст

на самом деле это ж очень просто записать последовательно числа и строку, тут главное не запутаться в смещениях данных
В приведенном выше коде я не увидел, где читается числовая информация. Любопытно посмотреть это целиком
--------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00459B8B in module 'Project1.exe'. Read of address 0000019C'. Process stopped. Use Step or Run to continue.
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0927 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.