Модераторы: 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   Вверх
Белоснежка
Дата 6.10.2013, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Вот весь код.. Прошу нигде не выставлять его.. До декабря.

Присоединённый файл ( Кол-во скачиваний: 4 )
Присоединённый файл  vfs1.c 21,01 Kb
PM MAIL Skype   Вверх
Белоснежка
Дата 6.10.2013, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Ошибка найдена smile
PM MAIL Skype   Вверх
Чупакабро
Дата 7.10.2013, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Белоснежка 
Эпично ))
Насколько я понял, проблема была в этой ветке:
Код

else if (strcmp(argv[2],"del")==0)

и, насколько я понял, ошибка заключалась в том, что после 
Код

used_block

нужно было прочитать еще blockcount байтов перед тем, как начать считывать строку.
Так?

И еще мучает вопрос: а почему на немецком (или какой это?) языке?

Это сообщение отредактировал(а) Чупакабро - 7.10.2013, 19:06
--------------------
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   Вверх
Белоснежка
Дата 9.10.2013, 19:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Там было намного больше ошибок.. И такие смешные.. Я практически закончила.. Сейчас университетский автомат проверяет.. Жду результат.. 

На немецком, потому что в Германии учусь/живу и т.д. ) Но в "немецком" интернете слишком мало программистов/информатиков.. Поэтому ответы там не найти.. Вот я тут и сижу )
PM MAIL Skype   Вверх
Чупакабро
Дата 9.10.2013, 22:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Белоснежка @  9.10.2013,  19: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   Вверх
Белоснежка
Дата 11.10.2013, 01:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(Чупакабро @ 9.10.2013,  22:20)
Цитата(Белоснежка @  9.10.2013,  19:40 Найти цитируемый пост)
На немецком, потому что в Германии учусь/живу и т.д. )

А какой курс, что за специальность, трудно ли учиться, почему С ? )))

Бакалавр Информатика.. Первый "курс"(бакалавр = 6 семестров(полугодий)), теоретическая информатика(дигитальная логика, микроархитектура, ассемблер, си и т.п.). Си вводит в программирование.. В этом семестре ко всему прочему будет java.. Короче, всё круто )

Ах да, вчера прошла автоматические тесты.. Осталось защитить, но это пятиминутное дело. smile Ура!

PM MAIL Skype   Вверх
Чупакабро
Дата 11.10.2013, 19:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Цитата(Белоснежка @  11.10.2013,  01:29 Найти цитируемый пост)
Ах да, вчера прошла автоматические тесты.. 

Поздравляю!
--------------------
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   Вверх
feodorv
Дата 12.10.2013, 10:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

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



Цитата(Чупакабро @  11.10.2013,  20:08 Найти цитируемый пост)
Поздравляю! 

И я тоже)))


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
akizelokro
Дата 12.10.2013, 10:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Крокодил
**


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

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



Мне приятель рассказывал, что у германцев действительно крутовато в этом плане. 6 лет надо обучиться на программера, выдают полный курс насколько возможно, основные алгоритмы и малость связанной математики чтоли ( сильное отличие от штатовского первоначального подхода, у немцев много консерватизма).
А меня просто вытолкали взашей лет 20 назад в жизнь, дали пинка под зад и - шуруй изучай всё самостоятельно, что такое и с чем это всё едят.


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


Опытный
**


Профиль
Группа: Участник
Сообщений: 537
Регистрация: 23.3.2008
Где: Комната

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



akizelokro, оно и понятно, 20 лет назад 93 год был. Все мы помним как в России с инф. технологиями было. У нас вон в государственном университете только недавно информатиков начали (если начали) программированию обучать, а так только делфи и всё. Благо я в частном учился.
З.Ы. германцы они такие немцы  smile 
PM MAIL ICQ Skype   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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