Skocz do zawartości

[C] (Początkujący) Wczytanie tekstu z pliku


michu

Polecane posty

Witam, jestem początkujący więc proszę o wyrozumiałość i cierpliwość wink.gif

oto fragment zawartości pliku tym.txt

DOKUMENT#KLIENT#DATA#WARTOSC
04A02035#ŻYWIEC-ZDRÓJ#01.03.2005#849,120
04A02034#ŻYWIEC-ZDRÓJ#01.03.2005#7 563,880
04A02031#ŻYWIEC-ZDRÓJ#01.03.2005#2 830,400
04A02033#ŻYWIEC-ZDRÓJ#01.03.2005#5 943,840
04A02032#ŻYWIEC-ZDRÓJ#01.03.2005#6 929,600
04D30756#WOJSZNIS P.#01.03.2005#-17,040
04C00632#KRUK N.#01.03.2005#1 080,000
04D20751#SAJGON#01.03.2005#307,440
04D50789#ŚWIĘCICKI#01.03.2005#-29,720
04C00630#CIROCKI#01.03.2005#35,000
04C00631#CIEMNY#01.03.2005#10,000
04H00836#CIEMNY#01.03.2005#225,920
04C00629#SYGNARSKI#01.03.2005#25,000

......

Program musi odczytać z tego pliku wartości zmiennej struktury KLIENT czyli np. :
ŻYWIEC-ZDRÓJ
WOJSZNIS P
KRUK N.
SAJGON
ŚWIĘCICKI

.....

i wyświetlić je na ekranie
warunek: nie mogą się powtarzać
separatorem jak widzicie jest #
na zajęciach napisaliśmy taki kod, ale w domu na devie mi nie dzialal:

-------------------------------------------------------------------------------------------------------------------

[code=C++] #include <stdlib.h>
#include <stdio.h>
#include [ [YH [ [XZ[[6\"Ś& amp;we\0dRŚgŚgŚg#BĆĆ(ĄąąŃltąŃlt
(Ą;=2)
{
printf("Zla nazwa");
exit(1);
HY[WK ][][ĘNYgÓT&FbgVC&ĆBGv&6ĆRgVC((((ĄŃŃ"w")==NULL)
{
printf("Blad");
^]

NBOLIJĘĘBĆR3vWF2gb333łb332b33ff2b333ł
Tb(Ń(ĄąĄŃĄ;='#' && c!=EOF)
{
YIN][ NĘBs3ŹŹ
(ŹŹ';
*w = NULL;
]ĘXJNf\"ÓśfCłCśĄąĄŃĄ;&c!=EOF);}
w=tab[JY]Ę
II32b33ff2b333łTbĄ
ŹŹ( *w++ = ';';

SSgWG2F\"ĆgĄąĄ=( fclose(fp);
JJN[J ][UTŃI][ĘN\0&WGW& [/code]

-------------------------------------------------------------------------------------------------------------------

wg kodu program zapisuje nazwiska oddzielając je średnikiem

przy kompilowaniu wyświetla mi błąd "cannot convert `bool' to `FILE*' in assignment"
pewnie coś źle przepisałem i dlatego ;/ ehh

a moze jest jakiś łatwiejszy sposób na wypisanie KLIENT'ów z pliku tekstowego ??

facet nam tłumaczył że program "czyta" tylko znaki od pierwszego do drugiego #
a potem jakoś przeskakuje dalej o dwa # co daje mozliwosc odczytania nazwiska z nastepnego wiersza

niestety nie potrafie dojść sam co jest źle dlatego prosze o pomoc i z góry dzięki za wszystkie wskazówki

// po co robisz takie wielkie odstępy? utrudniasz tylko czytanie postu, poza tym stosuj kolorowanie składni a nie pogrubianie do kodu - Iskar

Link do komentarza
Udostępnij na innych stronach

a w której linii jest ten błąd?

kodu mi się nie chciało czytowywać ale ja bym to tak wykonał

wczytujesz do stringa(czy też tablicy charów jak kto woli;)) całą linie a potem
lecisz forem po znakach jeżeli jest znak # to zaczynasz wczytywać kolejne znaki do drugiej tablicy a gdy jakiś znak jest # to kończy wczytywanie do tablicy i jedzie do końca linii
potem to samo z drugą linią
z trzecią też itd.
a co do tego żeby nie wypisywać 2 razy tej samej nazwy to możesz zrobić tablice już wypisanych nazw i sprawdzać czy już takiej nie ma
mam nadzieje że wyraziłem się jasno i zrozumiale smile.gif
pozdrawiam
DA

"Może wam pomoge, może nie, może pierdolcie w dupę się"-prof. Jarząbek

Link do komentarza
Udostępnij na innych stronach

dzięki za pokolorowanie kodu

@ DarkAndrew
wielkie dzięki za wskazówki, sprobuje tak zrobic

a co do błędu to na innym forum jeden user mi napisal:


[quote] Jesli chodzi o ten blad to powinno byc tak:
fp1=fopen("tym.txt","w");
if(fp1==NULL)
a co do samego odczytu pliku to zapomnij zeby Ci to dzialalo. Napisz to od nowa. [/quote]



?
Link do komentarza
Udostępnij na innych stronach

nawet jeżeli zastosuje sie do tego rozbicia lini na dwie to program nie dziala do konca:


[code=C++]
#include <stdlib.h>
#include <stdio.h>
#include [ [YH [ [XZ[[26\"Ś& amp;we\0dRŚgŚgŚg#BĆŹą(ĄąąŃltąŃlt
(Ą33;=2)
{
printf("Zla nazwa");
exit(1);HY[WK ][][ĘNbgÓT&FbgVC&ĆBGv&6ĆRgVC((((ŃŃuot;w");
if(fp1==NULL)
{
printf("Blad&][ĘN^]

NBOLIJĘĘBvĆR3vWF2gb333łb332b33ff2b333ł
T((Ń(ĄąĄtc(fp)!='#' && c!=EOF)
YIN][ NĘBs3ŹŹ
(+ = '#';
*w = '\ N]ĘXJNFf\"ÓśąŹŹ(ĄąĄŃĄp)!='#'&&c!=EOF);}
] XĆR3vWF2gb333łb332b33ff2b333łTb
Ą) { *w=c; w++;}}
*w++H NN
Ib3 #łb33łgWG2Ńą(
ĄąĄ;=EOF);
fclose(fp);
JJN77FVgVCU4RgVC\0&WGW&\0 [/code]

sad.gifdry.gif

Link do komentarza
Udostępnij na innych stronach

Kilka uwag:
1. Zrob indentacje kodu jak nalezy, bo w chwili obecnej wyglada to jak kupa i nawet nie chce mi sie go analizowac.
2. Skoro piszesz w c++ siegnij po zalecane metody czyli do odczytu uzyj streamow a nie antycznych metod
3. nie wiem czemu uparles sie na tablice a nie na struktory ktore az sie prosi aby tu uzyc ale niewazne
4. Dlaczego program nie dziala ? No sprawa jest dla mnie dosyc oczywista, otoz masz tablice tab i tab1 a przy odczycie za kazdym razem wskazujesz na ta sama tablice czyli kazda linia od poczatku bedzie nadpisywac stare dane, no chyba ze jest to tymczasowy bufer z ktorego bedziesz wyswietlal ale wyswietlania tez nie widze.
5. Program nie ma zabezpieczenia przed przekroczeniem zakresu tablicy, jak dane beda za dlugie zaczniesz nadpisywac pamiec i zaczna dziac sie cuda.
6. kombinacja twoich petli jest zaiste powalajaca a zapis na tyle czytelny ze pominalem ta czesc programu ale skoro caly czas robisz jedna czynnosc (odczyt stringa z pliku, oddzielonego separatorami) to napisz do tego procke i nazwij ja np GetNextString a pozniej wykonuj to cyklicznie.
7. Skoro masz problemy z podstawami dlaczego piszesz taki kod w oparciu o pointery a nie bezposrednie wskazanie w tablicy, latwiej by ci bylo analizowac bledy
8. Uzywales debugera aby sprawdzic co sie dzieje nie tak ?
9. blad o ktorym pisales w pierwszym poscie zakladam ze pojawial sie w lini: if(fp1=fopen("tym.txt","w")==NULL) do (iskara: mowilem ze C++ jest tak elastyczny ze ludzie nie wiedza jak on dokladnie dziala ?) a sprawdziles priorytety operacji ? jak sadzisz co najpierw bedzie wykonane podstawienie do fp1 czy operacja porownania z NULL'em ? No i wazna rzecz co bedziesz porownywal z NULLem fp1 czy fOpen ? Widze ze w drugim programie to poprawiles, ale warto sie na przyszlosc nad tym zastanowic.
10. idac w debugerze krok po kroku i patrzac na zawartosc zmiennych powinienes zrozumiec co ci chodzi nie tak....

Always Dark<br />u1_tt_logo.png banner-1.pngexFabula-banner.pngson_banner_ubersmall.jpg

Link do komentarza
Udostępnij na innych stronach

[quote] no ale czasami ostrzezenia kompilaotra sa bez sensu tongue.gif [/quote] wybacz ale sie nie zgadzam - po to one sa zeby na nie zwracac uwage. Kod w ktorym kompilator generuje ostrzezenia ma cos albo niejsanego albo nie zalecanego wiec nalezaloby na to zwrocic uwage. To iz wiekszosc to ignoruje wynika jedynie z faktu nieswiadomosci blink.gif a nie tego ze to nalezy ignorowac. Braki nawiasow, niejasnosc skladni itp prowadzi potem wlasnie do tego typu usterek ktore ciezko jest wylowic jak sie jest poczatkujecym ...

Link do komentarza
Udostępnij na innych stronach

Powyzszy kod był pisany przez mojego wykładowcę i sądząc po Waszych komentarzach nie najlepiej mu idzie w te klocki smile.gif


[quote] Dlaczego program nie dziala ? No sprawa jest dla mnie dosyc oczywista, otoz masz tablice tab i tab1 a przy odczycie za kazdym razem wskazujesz na ta sama tablice czyli kazda linia od poczatku bedzie nadpisywac stare dane, no chyba ze jest to tymczasowy bufer z ktorego bedziesz wyswietlal ale wyswietlania tez nie widze. [/quote]

nie wiem za bardzo o co chodzi, widać jeszcze długa droga nauki przede mną smile.gif najlepiej chyba by bylo zebym sam zaczal pisac ten program od poczatku (a raczej fragment programu, dalej ma sortowac nazwiska alfabetycznie, sumowac zmienną pliku tekstowego WARTOSC, rozpatrywać przedziały czasowe zakupów itd)

może jakimś cudem mi sie uda, mam jeszcze 2 miesiace na zrobienie smile.gif

dzieki za wszystkie dobre rady, jak macie jeszcze jakies pomysly do piszcie, nic sie nie zmarnuje

ok, lece sie dalej męczyć

Link do komentarza
Udostępnij na innych stronach

  • 4 weeks later...
witam to znowu ja, tym razem z takim pytaniem

poniżej znajdziecie fragment programu wczytującego kolejne znaki z pliku tekstowego faktury.txt
i wypisujacego niepowtarzajace sie nazwy firm w kolejsnosci alfabetycznej

zawartosc faktury.txt:

"HALIMAR","01D90003",1677.24000,20030102,7623.84000,9301.08000
"HURT.KUJAWIANKA","01D90004",1152.94000,20030102,5240.64000,6393.58000
"MIR-HURT","01D90005",1515.99000,20030102,6890.88000,8406.87000
"EDBOL","01D30002",528.00000,20030102,2400.00000,2928.00000
"EDBOL","01D30003",172.26000,20030102,783.00000,955.26000
"PANKOWSKA","01D50006",46.33000,20030102,210.60000,256.93000
"DYRKA A.","01D30004",118.35000,20030102,537.96000,656.31000
"GAJTKOWSKI B.","01H00003",35.72000,20030102,162.36000,198.08000
"STUPACKI S.","01H00004",58.07000,20030102,263.97000,322.04000


czyli wyswietli

1> DYRKA A.
2> EDBOL
3> GAJTKOWSKI B.
4> HALIMAR
5> HURT.KUJAWIANKA
6> MIR-HURT
7> PANKOWSKA



oto kod programu:

[code=C++] #include <stdio.h>
#include <dos.h>
#include &lt[ [YH [ Y[LVŚ6\"fGW&ł#Sł5ÓŚBŁÓŚ6\& quot;FFełÓfBĆŃ}ąŃĄ)}ĄĄlt)yswietl_liste(vo
id);

void main(){
char wybor='1';
N[ ][LQSHLVC&FbgVCb3#Bb3#C6'FvćRśĆVF(Ń aby oposcic program\n");
wybor=getch();
s]
X^H NINWY[Ę
N'&VłvĆRw&\"b333łb33b33fąŃ}ąŃĄ(%1ąŹ(Ą}ąŃl];
int i, j=0;
int sort=1;
char znak;
for (i=0; i&ltJĘĘB[ ][][ĘN[ ][LVCĆłfVgVCśfGW'GBgVCgVC\"gVCĄąŹ9U10(ŃŃ ąŃąu 'faktury.txt'\n");
delay(400);
}
[H[ ][LZ NZK Nb333b3#śgVC& amp;FbgVCb3#Ev7GvćRąŃ(ĄąĄąŹ(Źgetc(p
lik);
fscanf(plik, "%[^\"]",^WY[JN]
^WY[JNĆRŚćb333łb33b3 #śb33ffŚćb333łTbŹŃĄąŹ((ąĄąŹ(Ńk!\n
");
delay(500);
printf("&#092[YH[X]XHHY[ ][ĘN[R6'B6'CÓf\"ŁÓśfCŁśÓ(%($ĄąŃmumtąŃmŹumt($rcpy(nazwa_klienta, klient[j]);
strcpy(klient[j], klienWJNHJY[WK^WY[JNHLV6PbśĆVEśś
ÓÓśĆVEśłśłąŹ(%(((Ń=Ź;n");
delay(500);
wyswietl_liste();
}
}

void]
^VJ^[[L[NÓfCłŁb7G&6śĆVEśćvÓTwŃ(ĄŃŃĄąŃlŹt)
void wyswietl_liste(void){
int ekran=-1;
int i;
char znak=&NN
NOLIJĘĘ^Y
ZfCł#& amp;FbgVCb3#BVBb3#BW2b3#śgVCĄŹąąŃmt(Ź((ą(
tf("\t\t\t\tdowolny klawisz -dalej;H]ZYIL][ĘNZY]

NY
łÓb33b33'&Vł6'67\"V&ÓŃĄŹąąŃmt;
}
}
if (znak!='q'){
printf("&L L L LYXKZH]7b3#śgVCvWF6 [/code]





co zmienić żeby kod działał na pliku tekstowym o takiej zawartości:


04D30753#KASYNO 212#01.03.2005#200,810
04H00838#UNI-GAB#01.03.2005#491,510
04D30752#EKSTEROWICZ#01.03.2005#189,100
04D20748#TOMIR#01.03.2005#320,180
04B00173#PARAGON#01.03.2005#715,680
04D90603#OFERTA#01.03.2005#4 601,300
04D90602#REMIX 3#01.03.2005#811,640
04D50788#BOROWSKI L.#01.03.2005#409,550
04D60262#REINLENDER Z.#01.03.2005#96,380
04H00839#MANGO#01.03.2005#1 494,400


nie rozumiem szczególnie tej funkcji:
fscanf(plik, "%[^\"]", nazwa_klienta);


co to jest to pogrubione ????
dzieki za każdą pomoc
Link do komentarza
Udostępnij na innych stronach

Zarchiwizowany

Ten temat jest archiwizowany i nie można dodawać nowych odpowiedzi.

×
×
  • Utwórz nowe...