Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

pobranie danych z pliku -C/C++ -problem

26 Apr 2006 16:05 1533 5
  • Level 14  
    witajcie
    Mam problem w "prostym" programiku
    Code:

    #include <stdio.h>
    #include <conio.h>
    #include <iostream.h>
    #include <stdlib.h>
    #include <fstream.h>
    #include <math.h>

    int main()
    {
    FILE *plik;
    char znak,nazwaP[20];
    char haslo[100];
    const int sz=4;
    int linia=1,i=1;

    haslo[0]='\0';
    cout<<"haslo: "<<haslo;
    cout<<"plik: ";
    cin>>nazwaP;
    plik = fopen(nazwaP,"rt");
    while (!feof(plik))
    {
    znak=fgetc(plik);
       if(linia==sz)
        {
         if (znak!='|')
          {
          cout<<znak;
          haslo[i]=znak;
          i++;}
            else
            linia++;

        }
        else
         if(znak=='|')
         linia++;

    }
    fclose(plik);
    for(i=1;i<=strlen(haslo);i++)
    cout<<haslo[i];
    getchar();
    getchar();
    getchar();
    return 0;
    }


    a oto plik w którym są dane:

    Code:
    raz|dwa|trzy|czter|piec|sze|sied


    program powienien wyświetlić daną nazwę liczby z pliku w zależności od stałej sz i istotnie to robi z tym, że nazwa liczby powinna się wyświetlać w zmiennej "haslo", i tu tkwi problem - otóż oprócz nazwy liczby wyświetla również jakieś krzaczki i nie wiem jak się ich pozbyć.
    Bardzo proszę o pomoc
  • Helpful post
    Level 16  
    Code:
    #include <stdio.h> 
    
    #include <conio.h>
    #include <iostream>
    #include <stdlib.h>
    #include <math.h>
    using namespace std;

    int main()
    {
       FILE *plik;
       char nazwaP[20];
       char haslo[100];
       const int sz=4;
       int linia=1,i=1;
       cout<<"plik: ";
       cin >> nazwaP;
       plik = fopen(nazwaP,"rt");
       if(plik==NULL)
       {
          cout << endl << "Nie udalo sie otworzyc pliku" << endl;
          return 0;
       }
       while (!feof(plik))
       {
          fscanf(plik,"%99[^|]s",haslo);
          if(linia==sz)
             break;
          linia++;
          fgetc(plik);
       }
       fclose(plik);
       cout << haslo;
       getchar();
       getchar();
       return 0;
    }

    Nie ładniej? A co do twojego kodu to strlen() zwraca dlugosc napisu(ilosc znakow) w związku z tym, że elementy tablicy są numerowane od 0 ostatni będzie miał indeks strlen(napis)-1. Czyli warunek zamiast '<=' powinien być '<'.
  • Level 14  
    nigdy fscanf jeszcze nie używałem
    :idea: ten kod co mi podałeś to działa super :D

    po Twojej uwadze z strlen poprawiłem i nadal mam krzaczki więc totalnie nie wiem czy mój algorytm jest do bani czy funkcja nie ta :|
  • Helpful post
    Level 16  
    Dobra, jeszcze w tym wyświetlaniu 'i' zacznij od zera:
    Code:
    for(i=1;i<=strlen(haslo);i++) 
    
    cout<<haslo[i];

    zmien na:
    Code:
    for(i=0;i<strlen(haslo);i++) 
    
    cout<<haslo[i];

    A tak na marginesie to wyświetlenie tego można załatwić jedną funkcją:
    Code:
    cout << haslo;
    .
    I przy inicjalizacji zmiennej i tez zacznij od zera:
    Code:
    int linia=1,i=1;

    zamien na:
    Code:
    int linia=1,i=0;

    I jeszcze na końcu brakuje ci znaku końca stringu, czyli po linijce, albo przed linijką:
    Code:
    fclose(plik);

    dopisz:
    Code:
    haslo[i]=0;

    I zainteresuj sie scanf'em ta funkcja ma ogromne możliwości.
  • Level 11  
    ogólnie, jesli juz programujesz w C++ to wypada używać funkcji i metod właśnie tego języka....wiec zamiast scanfa lepiej uzywać operatora >>, nie trzeba tez w tym wypadku dołączać biblioteki C (stdio.h), zamiast getchar, mozna użyc cin.get(), a do poruszania się po pliku powinienes uzyć funkcji i metod z <fstream>
    (np. ifstream pobieraj;, ofstream zapisuj; pobieraj.open("nazwa.txt");....itd)
  • Level 10  
    ad_min wrote:
    ogólnie, jesli juz programujesz w C++ to wypada używać funkcji i metod właśnie tego języka...wiec zamiast scanfa lepiej uzywać operatora >>, nie trzeba tez w tym wypadku dołączać biblioteki C (stdio.h)

    nie do końca sie z Tobą zgodze, moze koledze zależy na czasie...