Forum Coders' city Strona Główna Coders' city
Nasza pasja to programowanie!
 

 PomocPomoc   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy  RejestracjaRejestracja 
Archiwum starego forum + teoria    RSS & Panel/SideBar
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Potrzebuję szybkiej odpowiedzi na moje pytanie... Zasady

[C] Wpisanie danych z pliku tekstowego do struktury



 
Odpowiedz do tematu    Forum Coders' city Strona Główna -> C i C++
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
nightrrayy



Dołączył: 08 Lip 2017
Posty: 2

PostWysłany: Sob Lip 08, 2017 3:22 pm  OP    Temat postu: [C] Wpisanie danych z pliku tekstowego do struktury Odpowiedz z cytatem Pisownia

Witam,
Mam problem z wpisaniem danych z pliku tekstowego do struktury.

Nazwa pliku to wyluskanie-adresu.txt

Plik tekstowy u mnie jest taki :

Cell 01 - Address:
Channel:
Frequency: (Channel)
Quality = Signal level =
ESSID:
Extra: Last beacon:
Oczywiście jest to zapełnione odpowiednimi wartościami. Chodzi tylko o zamysł. I takich połączeń może być sporo w zależności od tego w jakim momencie uruchomię swoją aplikację.

Kod jaki do tej pory wymyśliłem jest taki :

Kod:


#include <stdio.h>

int countlines(char *filename); // funkcja do zliczania linijek w tekscie




int main()
{



int i = 0;

int b = countlines("wyluskanie-adresu.txt");

struct  polaczenie{
    int cell;
    char mac[15];
    int channel;
    double frequency;
    int quality;
    char essid;
    double last_beacon;
}wifi[(b-1)/6];


FILE *emp_file;
emp_file = fopen("wyluskanie-adresu.txt","r");

  do {
        int n =
        fscanf(emp_file, "%d %s %d %d %d %s %f", &wifi[i].cell,
               wifi[i].mac, &wifi[i].channel,
               &wifi[i].frequency, &wifi[i].quality,
               &wifi[i].essid, &wifi[i].last_beacon);              
        //printf("i = %d, n = %d\n", i, n);
        i++;
    } while (feof(emp_file) == 0);
    
      for ( int k = 0; k < i; k++)
    {
        printf("%d,%s\n",wifi[k].cell,wifi[k].mac);
    }
    
    fclose(emp_file);

    return 0;
}


int countlines(char* filename)
{
    
    FILE *fp = fopen(filename,"r"); // otwarcie pliku tylko do odczytu ("r")
    int ch = 0; // bufor na znaki
    int lines = 0; // licznik linii
    
    if (fp == NULL) // jesli plik tekstowy jest pusty
    {
    return 0;
    }
    
    
while(!feof(fp))
{
  ch = fgetc(fp);
  if(ch == '\n')
  {
    lines++;
  }
}
    fclose(fp); // zamkniecie pliku tekstowego
    return lines;
}



Niestety nie działa on tak jak powinien. Zapętla się a chciałbym żeby te dane były wpisane do stuktur i tam przechowywane.
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
hicks
Site Admin


Dołączył: 25 Maj 2005
Posty: 1252
Skąd: DO-Wrocław

PostWysłany: Nie Lip 09, 2017 1:20 am      Temat postu: Odpowiedz z cytatem Pisownia

Program działa dokładnie tak jak powinien. Robi bowiem dokładnie to co mu kazano.

Kod się zapętla ponieważ funkcja fscanf nie umie dopasować danych z pliku do podanego formatu. W pliku masz dane typu:
Cell 01 - Address: 12:34:56:78:90:12
Channel: 123
Frequency: 2400 (Channel)
Quality = 123 Signal level = 123
ESSID: cokolwiek
Extra: Last beacon: 319

Jednakże każesz funkcji fscanf odczytać dane które powinny np. tak:
01 12:34:56:78:90:12 123 2400 123 123 cokolwiek 391

Już na pierwszym znaku format nie pasuje i funkcja fscanf przerywa pracę i pozycja w pliku się nie zmienia. To z kolei powoduje, że program się zapętla, bo uparcie próbuje ponownie bez sprawdzenia czy poprzedni odczyt się udał.

Przy okazji:
1. formatuj kod,
2. niepotrzebnie odczytujesz plik z danymi wejściowymi 2 razy,
3. czytanie z pliku po 1 znaku jest chyba najwolniejszą metodą jaka istnieje,
4. nigdzie nie ma sprawdzenia czy wystąpił błąd odczytu,
5. funkcja countlines zwraca błędne wartości,
6. adres MAC na pewno ma 14B? Wygląda dość specyficznie. Zwykle widuję zapisy 12-to, albo 17-to znakowe,
7. źle użyta (a o to nietrudno), funkcja fscanf może być niebezpieczna. Jeśli dane wejściowe mogą pochodzić z niezaufanego źródła to możliwe jest np. spowodowanie wyjścia po za poprawne pozycje w buforach odczytu.

_________________
Moje portfolio Oto ja
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość Odwiedź stronę autora
nightrrayy



Dołączył: 08 Lip 2017
Posty: 2

PostWysłany: Nie Lip 09, 2017 2:34 pm  OP    Temat postu: Odpowiedz z cytatem Pisownia

Dziękuje bardzo za odpowiedź. Kod już poprawiłem i działa jak należy. Jest jakiś sposób żeby połączyć się z danym urządzeniem poprzez Wi-Fi z poziomu aplikacji w C ?
Powrót do góry
Zobacz profil autora Wyślij prywatną wiadomość
Wyświetl posty z ostatnich:   
Odpowiedz do tematu    Forum Coders' city Strona Główna -> C i C++ Wszystkie czasy w strefie CET (Europa)

Strona 1 z 1

 
Skocz do:  
Możesz pisać nowe tematy
Możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów
Nie możesz głosować w ankietach
Możesz dodawać załączniki na tym forum
Możesz pobierać pliki z tego forum




Debug: strone wygenerowano w 0.23052 sekund, zapytan = 11
contact

| Darmowe programy i porady Jelcyna | Tansze zakupy w Helionie | MS Office Blog |