Сравнить запись в бинарном файле со строкой (СИ)

 
0
 
C++
ava
Белоснежка | 06.10.2013, 01:36
Итак.. В файл было записано с помощью fwrite. Теперь считываю через fread. В char *buffer. Потом делаю strstr(buffer,target_name). И не срабатывает ничего.. Хотя я точно знаю, что есть там таргет_нейм. Проверила что лежит в буффере.. 5 знаков непонятно чего... В чём может быть ошибка? Код выставлю вечером... 
Comments (24)
ava
Чупакабро | 06.10.2013, 09:38 #
Написал на С++, не знаю, скомпилируется ли на С

void find()
{
    char str[12], str1[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(str1, 1, count, file);
    fclose(file);
    char *s, s1[6];
    s = strstr(str1, "world");
    strcpy(s1,s);
    s1[5] = '\0';
    printf("%s", s1);
}
ava
Белоснежка | 06.10.2013, 11:40 #
А что делает т? В си такого нет. Я писала открыв буквами р+б, считывала файл, открытый для р
ava
Чупакабро | 06.10.2013, 12:09 #
Цитата (Белоснежка @  6.10.2013,  11:40 findReferencedText)
Кстати, числа без проблем считываются и они даже читабельны.. 

Код в студию
ava
Белоснежка | 06.10.2013, 12:17 #
Цитата (Чупакабро @ 6.10.2013,  12:09)
Цитата (Белоснежка @  6.10.2013,  11:40 \"findReferencedText\")
Кстати, числа без проблем считываются и они даже читабельны.. 


Код в студию

Запись:

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);
                }



Извиняюсь, что не всё.. Код оооочень длинный.. Какие отрезки ещё нужны?
ava
Чупакабро | 06.10.2013, 12:45 #
Ну, судя по приведенному коду, из файла читается строка

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);

и неизвестно, как мы пришли на эту позицию в файле
ava
Белоснежка | 06.10.2013, 13:19 #
эээ... Не знаю что я сделала, но оно заработало.... Спасибо.. 
ava
Чупакабро | 06.10.2013, 13:29 #
Цитата (Белоснежка @  6.10.2013,  13:19 findReferencedText)
эээ... Не знаю что я сделала, но оно заработало.... Спасибо..  

Поздравляю ))) Ну, программа-то, очевидно, нормально работающая, главное правильно скармливать ей исходные данные.
ava
Белоснежка | 06.10.2013, 14:48 #
А сколько нужно резервировать места, если считывается не только чары, но и uintmax_t несколько чисел?
ava
Чупакабро | 06.10.2013, 15:45 #
Цитата (Белоснежка @  6.10.2013,  14:48 findReferencedText)
А сколько нужно резервировать места, если считывается не только чары, но и uintmax_t несколько чисел? 

количество чаров + sizeof(unimax_t) * несколько
ava
akizelokro | 06.10.2013, 16:17 #
Я запутался в понимании кода. Но функция strstr в общем случае не для сравнения данных, считанных из бинарного файла.
ЛУчше использовать memcmp
ava
Белоснежка | 06.10.2013, 17:31 #
А если не сравнивать, можно считанное из бинарного файла привести в читабельный вид?

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

А можно описать полностью задачу? И что в итоге не получилось? Мне кажется, та немецкая копипаста не нужна, все можно сделать проще.
ava
Белоснежка | 06.10.2013, 19:59 #
Это виртуальная файловая система.. Файл, с которым у меня проблемы, организовывает добавление/удаление файлов. Я в него записываю: размер одного блока файловой системы, количество блоков, количество свободных и количество занятых блоков. потом для каждого блока записываю 1 или 0 в зависимости от того занят он или нет. а потом уже идёт информация о файлах, которые уже лежат в файловой системе.. информация выглядит так: длина имени файла, имя файла, размер файла, в скольких блоках он размешён, а потом черечисление блоков, в которых он размещён.. застряла на выяснение, есть ли уже файл с данным названием в файловой системе. для этого мне нужно считать имена файлов и сравнить с данным названием. всё.

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


скажите, а если я запишу строку в текстовой файл с fwrite, в файле будет текст или нечитаемые строки?
ava
Чупакабро | 06.10.2013, 21:18 #
Цитата (Белоснежка @  6.10.2013,  19:59 findReferencedText)
скажите, а если я запишу строку в текстовой файл с fwrite, в файле будет текст или нечитаемые строки? 

текст

на самом деле это ж очень просто записать последовательно числа и строку, тут главное не запутаться в смещениях данных
В приведенном выше коде я не увидел, где читается числовая информация. Любопытно посмотреть это целиком
ava
Белоснежка | 06.10.2013, 21:42 #
Вот весь код.. Прошу нигде не выставлять его.. До декабря.
ava
Белоснежка | 06.10.2013, 23:19 #
Ошибка найдена smile
ava
Чупакабро | 07.10.2013, 19:06 #
Белоснежка 
Эпично ))
Насколько я понял, проблема была в этой ветке:

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

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

used_block

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

И еще мучает вопрос: а почему на немецком (или какой это?) языке?
ava
Белоснежка | 09.10.2013, 19:40 #
Там было намного больше ошибок.. И такие смешные.. Я практически закончила.. Сейчас университетский автомат проверяет.. Жду результат..

На немецком, потому что в Германии учусь/живу и т.д. ) Но в "немецком" интернете слишком мало программистов/информатиков.. Поэтому ответы там не найти.. Вот я тут и сижу )
ava
Чупакабро | 09.10.2013, 22:20 #
Цитата (Белоснежка @  9.10.2013,  19:40 findReferencedText)
На немецком, потому что в Германии учусь/живу и т.д. )

А какой курс, что за специальность, трудно ли учиться, почему С ? )))
ava
Белоснежка | 11.10.2013, 01:29 #
Цитата (Чупакабро @ 9.10.2013,  22:20)
Цитата (Белоснежка @  9.10.2013,  19:40 \"findReferencedText\")
На немецком, потому что в Германии учусь/живу и т.д. )


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

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

Ах да, вчера прошла автоматические тесты.. Осталось защитить, но это пятиминутное дело. smile Ура!
ava
Чупакабро | 11.10.2013, 19:08 #
Цитата (Белоснежка @  11.10.2013,  01:29 findReferencedText)
Ах да, вчера прошла автоматические тесты.. 

Поздравляю!
ava
feodorv | 12.10.2013, 10:11 #
Цитата (Чупакабро @  11.10.2013,  20:08 findReferencedText)
Поздравляю! 

И я тоже)))
ava
akizelokro | 12.10.2013, 10:29 #
Мне приятель рассказывал, что у германцев действительно крутовато в этом плане. 6 лет надо обучиться на программера, выдают полный курс насколько возможно, основные алгоритмы и малость связанной математики чтоли ( сильное отличие от штатовского первоначального подхода, у немцев много консерватизма).
А меня просто вытолкали взашей лет 20 назад в жизнь, дали пинка под зад и - шуруй изучай всё самостоятельно, что такое и с чем это всё едят.
ava
EgoBrain | 14.10.2013, 04:47 #
akizelokro, оно и понятно, 20 лет назад 93 год был. Все мы помним как в России с инф. технологиями было. У нас вон в государственном университете только недавно информатиков начали (если начали) программированию обучать, а так только делфи и всё. Благо я в частном учился.
З.Ы. германцы они такие немцы  smile 
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
advanced
Submit