[C] Wyszukiwanie informacji w pliku

Boshi
Użytkownik
Użytkownik
Posty: 43
Rejestracja: 21 wrz 2010, o 18:37
Płeć: Mężczyzna
Podziękował: 1 raz

[C] Wyszukiwanie informacji w pliku

Post autor: Boshi »

Cześć,
W jaki sposób można wyszukać informację w pliku binarnym w C?

Pytam o nr buta, otwieram plik i co dalej ? moja implementacja: ( niestety nic nie znajduje, gdzie jest błąd?) Oczywiście samo otwarcie pliku jest ok ( nie dawałem całego kodu, by nie mieszać)
Chodzi o samo wyszukanie informacji zapisanych w pliku binarnym

Kod: Zaznacz cały

printf("Podaj nr buta?
");
scanf("%s",but);
hendel=fopen(adres, "rb");
if ((hendel=fopen==NULL)){
    printf("Blad otwarcia pliku
");
    }
    else{
     if  (strcmp(but,osoba.but)==0){{

 printf("Oto twoj but! 
");
     }

    fclose(hendel);
    }
Raz wyszukalo coś, a teraz znów przestało... co jest grane? czy to w petli nie powinno być?
Ostatnio zmieniony 30 kwie 2014, o 23:57 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10223
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2361 razy

[C] Wyszukiwanie informacji w pliku

Post autor: Dasio11 »

Nie da się wyszukać czystej informacji w pliku binarnym, bo plik nie jest zbiorem informacji. Plik jest ciągiem bajtów. Jedyne, co można zrobić, to wczytać je do tablicy i przetwarzać niskopoziomowo, tak jak się przetwarza znaki. Szukanie informacji w pliku, w którym ta informacja jest zapisana w danym formacie, musisz napisać sam.

Na przykład, jeśli plik ma postać:

Kod: Zaznacz cały

1.
Imię: Adrian
Waga: 70kg
Nr buta: 45

2.
Imię: Grzegorz
Waga: 86kg
Nr buta: 42

3. 
Imię: Daniel
Waga: 69kg
Nr buta: 46

to wyszukiwanie polega na powtarzeniu procedury:

1. Znajdź ciąg znaków Nr buta:
2. Zinterpretuj ciąg cyfr, który po nim następuje, jako liczbę
3. Porównaj tę liczbę z szukanym kluczem

do momentu, w którym pierwszy punkt zakończy się niepowodzeniem.
Boshi pisze:

Kod: Zaznacz cały

if ((hendel=fopen==NULL))
Ten kawałek zrobi kompletnie nie to, co chcesz. Najpierw porówna adres funkcji fopen z NULLem (co zawsze zwróci fałsz), a następnie wynik porównania (zawsze fałsz) przypisze do zmiennej hendel i tej wartości użyje, by rozstrzygnąć, w który przypadek if wejść. Poprawnie byłoby tak:

Kod: Zaznacz cały

if( hendel == NULL ) 
{ /* ... */ }
Boshi pisze:

Kod: Zaznacz cały

if  (strcmp(but,osoba.but)==0)
A z kolei to porównanie nie ma nic wspólnego z przeszukiwaniem pliku. Porównywana z kluczem jest tablica znaków znajdująca się w pamięci pod adresem osoba.but, a nie zawartość pliku. Jeśli program sprawia wrażenie, jakby cokolwiek wyszukał, to tylko dlatego, że we wcześniejszej części kodu do tej tablicy wpisana jest wartość równa wyszukiwanej i dlatego porównanie kończy się sukcesem.
Boshi
Użytkownik
Użytkownik
Posty: 43
Rejestracja: 21 wrz 2010, o 18:37
Płeć: Mężczyzna
Podziękował: 1 raz

[C] Wyszukiwanie informacji w pliku

Post autor: Boshi »

OK, poprawię zaraz te błędy. Jednak dalej nie rozumiem jak mam w tym pliku(binarnym) to wyszukać. Mógłbyś podać jakiś przykład na pliku który umieściłeś wcześniej z 3 osobami ?
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10223
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2361 razy

[C] Wyszukiwanie informacji w pliku

Post autor: Dasio11 »

W przypadku mojego pliku, program wyszukujący informacje mógłby wyglądać tak:

Kod: Zaznacz cały

#include <stdio.h>
#include <string.h>


int main()
{
    FILE* FS = fopen( "Dane.txt", "rb" );
    if( FS == NULL )
    {
        printf( "Nie udalo sie otworzyc pliku. \n" );
        return -1;
    }

    char Array[513];
    fgets( Array, 512, FS );

    while( !feof( FS ) && !ferror( FS ) )
    {
        if( strncmp( Array, "Nr buta: ", 9 ) == 0 )
        {
            /* Czytanie numeru buta w znalezionym miejscu */
            int Nr = 0;
            for( int i = 9; '0' <= Array[i] && Array[i] <= '9'; ++i )
            {
                Nr *= 10;
                Nr += Array[i] - '0';
            }

            printf( "Znaleziono numer buta: %d\n", Nr );
        }

        fgets( Array, 512, FS );
    }

    fclose( FS );

    return 0;
}
Zwracam uwagę, że do poprawnego działania tego kodu oprócz odpowiedniej formy pliku (numery butów w linijkach zaczynających się od Nr buta: ) potrzebna jest też pusta linia na końcu pliku.
Boshi
Użytkownik
Użytkownik
Posty: 43
Rejestracja: 21 wrz 2010, o 18:37
Płeć: Mężczyzna
Podziękował: 1 raz

[C] Wyszukiwanie informacji w pliku

Post autor: Boshi »

No dobrze, tylko, że owy kod jest napisany pod jeden przypadek, a gdy chciałbym np szukać imię lub cokolwiek innego?
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10223
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2361 razy

[C] Wyszukiwanie informacji w pliku

Post autor: Dasio11 »

Aby w tym samym pliku wyszukać imię, mój kod wystarczy lekko przerobić. To nie jest trudne.
Ale jeśli chodzi o dowolny plik z informacjami, to żeby napisać kod wyszukujący, trzeba najpierw wiedzieć, jak ten plik jest zorganizowany.
Boshi
Użytkownik
Użytkownik
Posty: 43
Rejestracja: 21 wrz 2010, o 18:37
Płeć: Mężczyzna
Podziękował: 1 raz

[C] Wyszukiwanie informacji w pliku

Post autor: Boshi »

Trochę rozjaśnię.

Mam do napisania funkcję która wyszukuję w pliku binarnym informację o np imieniu,nazwisku itd, co sobie zażyczy użytkownik. Aktualnie mój plik binarny to w notatniku stek śmieci co chyba nie dziwi. Twój kod oczywiście jest łatwy do przerobienia pod konkretny przypadek,konkretną linię, ale tutaj potrzebne mi jest coś co przeleci calutki plik, znajdzie informację zakończy szukanie i wyświetli dane których szukamy lub brak owych danych.
Awatar użytkownika
Dasio11
Moderator
Moderator
Posty: 10223
Rejestracja: 21 kwie 2009, o 19:04
Płeć: Mężczyzna
Lokalizacja: Wrocław
Podziękował: 40 razy
Pomógł: 2361 razy

[C] Wyszukiwanie informacji w pliku

Post autor: Dasio11 »

Nadal nie rozumiem, w czym leży problem. Chodzi o to, że twój plik binarny wygląda inaczej niż ten, który podałem dla przykładu? Albo o to, że mój kod szuka numeru buta zamiast pytać użytkownika, czego ma szukać?
Boshi
Użytkownik
Użytkownik
Posty: 43
Rejestracja: 21 wrz 2010, o 18:37
Płeć: Mężczyzna
Podziękował: 1 raz

[C] Wyszukiwanie informacji w pliku

Post autor: Boshi »

Problem leży, w tym, że twój kod jest pod konkretną danę przygotowany. Konkretną linię itd. A co gdy nie mam pojęcia w której lini leży nazwisko "kowalski"?

Po prostu wpisuje- szukam nazwiska kowalski i procedura wyszukuje to nazwisko w pliku.
Awatar użytkownika
jarzabek89
Użytkownik
Użytkownik
Posty: 1337
Rejestracja: 11 lis 2007, o 21:36
Płeć: Mężczyzna
Lokalizacja: Gdańsk
Podziękował: 4 razy
Pomógł: 181 razy

[C] Wyszukiwanie informacji w pliku

Post autor: jarzabek89 »

Przedstawię mój sposób, sam bym tego tak pewnie nie napisał, ale jeśli ktoś jest początkujący powinien z łatwością zrozumieć mój tok myślenia.
Z góry uprzedzam, że programuję głównie w C++ i nie pamiętam wszystkich różnic pomiędzy C, a C++.

Sposób znalezienia nazwiska "Kowalski" w tekście.
Oczywiście, zapisujemy owe nazwisko do jakiejś zmiennej.

Pobieramy jeden znak z pliku, zapisujemy do jakieś zmiennej(nazwijmy ją "szukana"), pobieramy kolejny znak, dołączamy do zmiennej szukana (funkcja strcpy). Wczytujemy tak długo aż napotkamy znak biały,dwukropek, kropkę, przecinek, w zależności od tego jak wygląda plik(można użyć << pod warunkiem że wyrazy będą oddzielone znakami białymi).

Jak znajdzie owe nazwisko, to robisz to co tam chcesz, kursor masz ustawiony za znalezionym nazwiskiem.
matematok
Użytkownik
Użytkownik
Posty: 9
Rejestracja: 9 maja 2014, o 23:07
Płeć: Mężczyzna
Lokalizacja: wawa

[C] Wyszukiwanie informacji w pliku

Post autor: matematok »

Boshi pisze:Problem leży, w tym, że twój kod jest pod konkretną danę przygotowany. Konkretną linię itd. A co gdy nie mam pojęcia w której lini leży nazwisko "kowalski"?

Po prostu wpisuje- szukam nazwiska kowalski i procedura wyszukuje to nazwisko w pliku.
Witaj,

W celu analizy jakichkolwiek danych, parser musi wiedzieć czego ma szukać - to nie człowiek, który potrafi bez zadania jakiś konkretnych wytycznych i kryteriów odnaleźć coś czego być może szuka, a dowie się o tym jak to znajdzie.

Jeśli chcesz stworzyć w miarę uniwersalny parser, musisz mu podać kryteria leksykalne, gramatyczne, etc. czyli coś co pozwoli mu na zrozumienie tego co czyta - tu nie ma większego znaczenia jakie dane mu przekażesz, tak czy tak wszystkie to tylko bity/bajty/słowa...

Im bardziej ma być uniwersalny, tym jego złożoność rośnie (lub im bardziej złożony język).

Jeśli dane jakie dostajesz na wejściu są Ci zupełnie nie znane lub nie posiadają jakiejś konkretnej - w miarę możliwości - usystematyzowanej składni czy struktury, możesz uznać te dane za losowe, a w takim przypadku wyszukiwanie danych sprowadza się do heurystyki/SSN/algorytmów decyzyjnych lub też wyrażenia regularne, aczkolwiek w takiej sytuacji, raczej bym ich odradzał bez wstępnej analizy (czyli - uogólniając - szukasz czegoś, co jest lub przypomina w jakimś stopniu wzorzec, który jest Ci znany).

Jeśli w danych brak jakiegokolwiek wzorca lub struktury (nawet uogólnionej), dane wejściowe to nic innego jak szum z którym nic nie zrobisz, co najwyżej możesz mieć lód szczęścia i znajdziesz pewną kombinację, która może - ale nie musi - pasować do Twych kryteriów, jednakże, ponieważ są to dane nie posiadające struktury, przez co to co znajdziesz może być tylko pustym trafieniem.

Suma-sumarum, bez jakiejkolwiek struktury czy formatu danych i zdefiniowaniu ich w języku zrozumiałym dla parsera nie dokonasz analizy składniowej.

Pozdrawiam
ODPOWIEDZ