maybach Opublikowano 15 Września 2005 Zgłoś Opublikowano 15 Września 2005 Witam. Otoz problem :-( Jak odczytac z pliku tekstowego pewien ciag znakow, np. "Ala ma kota". Jest to ciag, ktory zawiera biale znaki. Jak proboje go przeczytac, to fscanf odczytuje mi tylko pierwszy wyraz (do pierwszej spacji) czyli samo slowo "Ala". Czy mozna tak zrobic, abym mogl sobie ustawic, aby odczytac ciag np. 15 znakow, nie zaleznie od tego czy zawiera spacje czy nie?? Pozdrawiam Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
antrykot111 Opublikowano 15 Września 2005 Zgłoś Opublikowano 15 Września 2005 Witam. Otoz problem :-( Jak odczytac z pliku tekstowego pewien ciag znakow, np. "Ala ma kota". Jest to ciag, ktory zawiera biale znaki. Jak proboje go przeczytac, to fscanf odczytuje mi tylko pierwszy wyraz (do pierwszej spacji) czyli samo slowo "Ala". Czy mozna tak zrobic, abym mogl sobie ustawic, aby odczytac ciag np. 15 znakow, nie zaleznie od tego czy zawiera spacje czy nie?? Pozdrawiam 1650998[/snapback] chyba tak: char *buf = new char[100];HFILE file = fopen("file.txt","r");fread(buf,15,1,file);Powinno śmigać :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 15 Września 2005 Zgłoś Opublikowano 15 Września 2005 (edytowane) albo: const int rozmiar = 100;char *buf = new char[rozmiar+1];int i=0;FILE fp = fopen("plik.txt", "rb");while(fscanf(fp, "%c", &buf[i])>=0 && i<rozmiar) i++;powyzszy przyklad odczytuje 100 bajtow pliku, lub mniej jesli plik sie skonczy szybciej :) Edytowane 15 Września 2005 przez Nargil Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
sikor_soft Opublikowano 16 Września 2005 Zgłoś Opublikowano 16 Września 2005 ewentualnie otwierasz plik, czyta znak po znaku i porównuje z końcem wiersza (jeśli plik tekstowy i chodzi o cały wiersz - kod EOL <end of line>) - lub z końcem pliku (cały plik, kod EOF <End Of File>). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
enzo Opublikowano 19 Września 2005 Zgłoś Opublikowano 19 Września 2005 (edytowane) chyba tak: char *buf = new char[100];HFILE file = fopen("file.txt","r");fread(buf,15,1,file);Powinno śmigać :) 1651050[/snapback] hym nie rozumiem czemu stosujesz funkcje do odczytywania danych binarnych skoro to jest plik tekstowy, dla ktorego jest inny zestaw funkcji. ja bym to zrobil tak: char bufor[100];FILE *plik;plik=fopen( "plik.txt", "r" );fgets( bufor,100,plik ); ewentualnie otwierasz plik, czyta znak po znaku i porównuje z końcem wiersza (jeśli plik tekstowy i chodzi o cały wiersz - kod EOL <end of line>) - lub z końcem pliku (cały plik, kod EOF <End Of File>). jestes pewien ze w C jest taki kod jak EOL? bo ja o nim nie slyszalem (ale to moze byc tylko moja nie wiedza). Edytowane 19 Września 2005 przez enzo Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
antrykot111 Opublikowano 19 Września 2005 Zgłoś Opublikowano 19 Września 2005 hym nie rozumiem czemu stosujesz funkcje do odczytywania danych binarnych skoro to jest plik tekstowy, dla ktorego jest inny zestaw funkcji. ja bym to zrobil tak: char bufor[100];FILE *plik;plik=fopen( "plik.txt", "r" );fgets( bufor,100,plik ); ewentualnie otwierasz plik, czyta znak po znaku i porównuje z końcem wiersza (jeśli plik tekstowy i chodzi o cały wiersz - kod EOL <end of line>) - lub z końcem pliku (cały plik, kod EOF <End Of File>). jestes pewien ze w C jest taki kod jak EOL? bo ja o nim nie slyszalem (ale to moze byc tylko moja nie wiedza). 1657779[/snapback] No fakt, dawno nie używałem tego do czytania plików :) A kod EOL to chyba to samo co : '\r\n' ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 19 Września 2005 Zgłoś Opublikowano 19 Września 2005 napewno nie ma a przynajmniej nie do uzycia w funkcji czytajacej znak po znaku :) Bo \r\n to 2 bajty wiec niby jak on ma sprawdzic czy char c == "\r\n" ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Artur.M Opublikowano 19 Września 2005 Zgłoś Opublikowano 19 Września 2005 Nie jestem pewien ale mi się coś kojarzy że \r\n to przejście do nowej lini np. podczas zapisywania tekstu. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 19 Września 2005 Zgłoś Opublikowano 19 Września 2005 a kto temu przeczy ? :D Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
enzo Opublikowano 19 Września 2005 Zgłoś Opublikowano 19 Września 2005 @ Nargil to ze ta stala ma 2 bajty nic nie przekresla, bo np EOF tez ma wiecej niz 1 bajt. jakbys sie dokladnie przyjrzal prototypom funkcji znakowego wejsci-wyjscia zauwazylbys ze one zwracaja int'y. dlatego jesli zczytuje sie znaki z pliku nalezy kozystac nie z char'ow tylko z int'ow. co do tej stalej EOL to jesli to jest \r\n to nie za bardzo mozna ja stosowac w plikach bo tam raczej nie wystepuje \r ( po co komu w pliku znak powrotu karetki? ). przynajmniej ja sie z tym nie spotkalem a przejscie do nowej linii bylo wykonywane tylko i wylacznie poprzez znak \n. btw. jesli EOL to \r\n to oznaczalo by to ze najpierw znak karetki powraca na poczatek dopiero nastepnie nastepuje przejscie do nowej linii, czyli w sumie to przesunelibysmy biezaca linijke o jedna do dolu. (mam nadzieje ze za bardzo nie pobladzilem w moim rozumowaniu :/) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
antrykot111 Opublikowano 19 Września 2005 Zgłoś Opublikowano 19 Września 2005 @ Nargil to ze ta stala ma 2 bajty nic nie przekresla, bo np EOF tez ma wiecej niz 1 bajt. jakbys sie dokladnie przyjrzal prototypom funkcji znakowego wejsci-wyjscia zauwazylbys ze one zwracaja int'y. dlatego jesli zczytuje sie znaki z pliku nalezy kozystac nie z char'ow tylko z int'ow. co do tej stalej EOL to jesli to jest \r\n to nie za bardzo mozna ja stosowac w plikach bo tam raczej nie wystepuje \r ( po co komu w pliku znak powrotu karetki? ). przynajmniej ja sie z tym nie spotkalem a przejscie do nowej linii bylo wykonywane tylko i wylacznie poprzez znak \n. btw. jesli EOL to \r\n to oznaczalo by to ze najpierw znak karetki powraca na poczatek dopiero nastepnie nastepuje przejscie do nowej linii, czyli w sumie to przesunelibysmy biezaca linijke o jedna do dolu. (mam nadzieje ze za bardzo nie pobladzilem w moim rozumowaniu :/) 1658247[/snapback] Jeśli zapisujesz na końcu samo '\n' to w notepadzie masz o ile mnie pamięc niemyli krzaka :) Natomiast '\r\n' (nie pamiętam czy tak czy na odwrót r z n) pozwala notepadowi otworzyć poprawnie :) Lepsz edytory (WordPad :wink: ) już sobie z tym radzą :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 19 Września 2005 Zgłoś Opublikowano 19 Września 2005 Podczas zapisywania do pliku w trybie tekstowym każde wystąpienie znaku '\n' jest zastępowane '\r'+'\n' jeden za drugim. Podczas czytania jest odwrotnie i vice wersa. Czyli prawidłowo przy odczycie lub zapisie powinno być samo '\n' lub '\r'+'\n'. A bez sensu jest '\n'+'\r', bo samo \n jest przerabiane na '\n'+'\r' a my potem jeszcze dokładamy '\r' Wychodzą bzdury w pliku bo tam '\r' nie istnieje. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
antrykot111 Opublikowano 19 Września 2005 Zgłoś Opublikowano 19 Września 2005 Podczas zapisywania do pliku w trybie tekstowym każde wystąpienie znaku '\n' jest zastępowane '\r'+'\n' jeden za drugim. Podczas czytania jest odwrotnie i vice wersa. Czyli prawidłowo przy odczycie lub zapisie powinno być samo '\n' lub '\r'+'\n'. A bez sensu jest '\n'+'\r', bo samo \n jest przerabiane na '\n'+'\r' a my potem jeszcze dokładamy '\r' Wychodzą bzdury w pliku bo tam '\r' nie istnieje. 1658390[/snapback] A teraz zajażyłem czemu jestem w błędzie :wink: Gdy jakiś czas temu robiłem HTML loggera zapisywałem text binarnie WriteFile czy tam _lwrite (nie pamiętam) i stąd to zamieszanie :) Sory za wprowadzanie w błąd :unsure: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
sikor_soft Opublikowano 20 Września 2005 Zgłoś Opublikowano 20 Września 2005 jestes pewien ze w C jest taki kod jak EOL? bo ja o nim nie slyszalem (ale to moze byc tylko moja nie wiedza). 1657779[/snapback] Jedno nie przeczy drugiemu - zawsze możesz dać ifa po wykryciu jednego kodu... Nie pamiętam dokładnie struktury EOL, ale to da się sprawdzić. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
enzo Opublikowano 20 Września 2005 Zgłoś Opublikowano 20 Września 2005 ok doczytalem o EOL i dowiedzialem sie tego ze EOL pod winshitem to \r\n a pod linuxem to samo \n. ( ja programuje pod linuxem wiec zapewne dlatego nie spotkalem sie z kombinajcja \r\n, to tak dla sprostowania ;p ) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
MeHow Opublikowano 20 Września 2005 Zgłoś Opublikowano 20 Września 2005 nargil, to powinno byc tak: const int rozmiar = 100; char buf[rozmiar+1]; int i=0; FILE *fp; fp = fopen("test.txt", "r"); while(fscanf(fp, "%c", &buf[i])>=0 && i<rozmiar) i++; a nie tak jak napisales. Skad Ci sie "new" wzielo w C ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
maybach Opublikowano 21 Września 2005 Zgłoś Opublikowano 21 Września 2005 dzieki ludzie za te wszystkie pomoce, ale znalazlem jeszcze jedna funkcje: char *fgets(char *s, size_t n, FILE *stream); pod zmienna 'n' podaje liczbe znakow do odczytania. Nie trzeba czytac znak po znaku. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
enzo Opublikowano 21 Września 2005 Zgłoś Opublikowano 21 Września 2005 dzieki ludzie za te wszystkie pomoce, ale znalazlem jeszcze jedna funkcje: char *fgets(char *s, size_t n, FILE *stream); pod zmienna 'n' podaje liczbe znakow do odczytania. Nie trzeba czytac znak po znaku. 1661844[/snapback] eh widac ze nie czytasz uwaznie tego co ci inni odpisuja. kilka postow wyzej podalem ci przyklad z urzyciem tej funkcji. :mur: Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
sikor_soft Opublikowano 22 Września 2005 Zgłoś Opublikowano 22 Września 2005 dzieki ludzie za te wszystkie pomoce, ale znalazlem jeszcze jedna funkcje: char *fgets(char *s, size_t n, FILE *stream); pod zmienna 'n' podaje liczbe znakow do odczytania. Nie trzeba czytac znak po znaku. 1661844[/snapback] O.K. - ale co zrobisz, gdy tekst jest długi i nie znasz go wcześniej? Szukana fraza jest podawana przez użytkownika, plik to powiedzmy encyklopedia w formie tekstu? Znając położenie szukanego tekstu i mając krótki plik - nie ma sprawy, ale w dłuższym pliku to już może być problem. Przyupuszczam, że kolejnym zadaniem (pewnie to było na zaliczenie) będzie porównanie tekstów w kilku plikach (albo sprawdzenie, czy dana fraza znajduje się w kilku różnych plikach), więc wtedy i tak musisz porównać, chociaż oczywiście metoda znak po znaku jest dość wolna... Zawsze można skorzystać z innych funkcji - a jakich, to już pozostawiam dociekliwym ;) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
KrzychuG Opublikowano 22 Września 2005 Zgłoś Opublikowano 22 Września 2005 O.K. - ale co zrobisz, gdy tekst jest długi i nie znasz go wcześniej? Szukana fraza jest podawana przez użytkownika, plik to powiedzmy encyklopedia w formie tekstu? 1662256[/snapback] Odczytujesz go linia po linii (tak shematycznie): f = fopen("pliczek", "r");while (!feof(f)) { fgets(blah, 1023, f); parse_data(blah);} Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
mina86 Opublikowano 23 Września 2005 Zgłoś Opublikowano 23 Września 2005 Czy mozna tak zrobic, abym mogl sobie ustawic, aby odczytac ciag np. 15 znakow, nie zaleznie od tego czy zawiera spacje czy nie??Poczaruj sobie z fscanf("%15c", string). Pamiętaj jednak żeby zawczasu zmienną string wypełnić zerami bo %c nie zapisuje kończącego znaku NUL ('\0'). hym nie rozumiem czemu stosujesz funkcje do odczytywania danych binarnych skoro to jest plik tekstowy, dla ktorego jest inny zestaw funkcji.A ja nie rozumiem czemu nie. :) A kod EOL to chyba to samo co : '\r\n' ?To zależy w jakim formacie plik został zapisany. W Windowsie, DOS-ie i takich tam EOL to "\r\n". W uniksach to '\n', a na Macach jeszcze coś innego (już dokładnie nie pamiętam czy to jest '\r' czy '\n\r'). napewno nie ma a przynajmniej nie do uzycia w funkcji czytajacej znak po znaku :) Bo \r\n to 2 bajty wiec niby jak on ma sprawdzic czy char c == "\r\n" ?Należy sprawdzać czy c == '\n'. to ze ta stala ma 2 bajty nic nie przekresla, bo np EOF tez ma wiecej niz 1 bajt. jakbys sie dokladnie przyjrzal prototypom funkcji znakowego wejsci-wyjscia zauwazylbys ze one zwracaja int'y. dlatego jesli zczytuje sie znaki z pliku nalezy kozystac nie z char'ow tylko z int'ow.Muahahahahaha.. Dobry joke ;) Owszem, zwraca inty, ale przyjmują one jedynie wartości od 0 do 255 jeżeli odczytano znak lub EOF (najczęściej -1) gdy napotkano na koniec pliku. o do tej stalej EOL to jesli to jest \r\n to nie za bardzo mozna ja stosowac w plikach bo tam raczej nie wystepuje \r ( po co komu w pliku znak powrotu karetki? ). przynajmniej ja sie z tym nie spotkalem a przejscie do nowej linii bylo wykonywane tylko i wylacznie poprzez znak \n.A przyglądałeś się dokładnie jakiemuś plikowi zapisanemu pod Windowsem? Chyba nie :) btw. jesli EOL to \r\n to oznaczalo by to ze najpierw znak karetki powraca na poczatek dopiero nastepnie nastepuje przejscie do nowej linii, czyli w sumie to przesunelibysmy biezaca linijke o jedna do dolu. (mam nadzieje ze za bardzo nie pobladzilem w moim rozumowaniu :/)Nie, bo '\n' to new line, a nie jakieś move line to next line czy cokolwiek innego. '\n' jedynie przesuwa karetkę w dół. Jeśli zapisujesz na końcu samo '\n' to w notepadzie masz o ile mnie pamięc niemyli krzaka :)Tutaj mogę się mylić, ale wydaje mi się, że w nowszych notepadach to poprawili zlekka. Odczytujesz go linia po liniiA co jak linia ma np. 100 tysięcy znakow? Sposób z fgets() w takich wypadkach może nie zadziałać. Osobiście bym coś takiego robił odczytując plik na zmianę do 2 buforów, żeby móc sprawdzać czy dany tekst występuje, w którymś z odczytanych fragmentów lub na granicy obu buforów. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
antrykot111 Opublikowano 23 Września 2005 Zgłoś Opublikowano 23 Września 2005 Tutaj mogę się mylić, ale wydaje mi się, że w nowszych notepadach to poprawili zlekka. Mam XPeka i sie dośćdługo zastanwiałem czemu wywala krzaka :) Dopiero potem na forum powiedziano mi że ma być \r\n a nie samo \n :) Ale WordPad i reszta wypaśniejszychedytorków już sobie radzi :) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
enzo Opublikowano 23 Września 2005 Zgłoś Opublikowano 23 Września 2005 (edytowane) hym nie rozumiem czemu stosujesz funkcje do odczytywania danych binarnych skoro to jest plik tekstowy, dla ktorego jest inny zestaw funkcji. A ja nie rozumiem czemu nie. icon_smile3.gif chociazby dlatego ze jak chlopak stawia dopiero piersze kroki w C i zacznie mieszac rozne funkcje przeznaczone do czego innego to moze pozniej miec przez to problemy przy pisaniu jakis innych progsow. takie mieszanie funkcji moze prowadzic czasami do niepotrzebnych bledow. to ze ta stala ma 2 bajty nic nie przekresla, bo np EOF tez ma wiecej niz 1 bajt. jakbys sie dokladnie przyjrzal prototypom funkcji znakowego wejsci-wyjscia zauwazylbys ze one zwracaja int'y. dlatego jesli zczytuje sie znaki z pliku nalezy kozystac nie z char'ow tylko z int'ow. Muahahahahaha.. Dobry joke icon_wink2.gif Owszem, zwraca inty, ale przyjmują one jedynie wartości od 0 do 255 jeżeli odczytano znak lub EOF (najczęściej -1) gdy napotkano na koniec pliku. hym... wlasnie sam sobie zaprzeczyles. napisales ze wartosci zwracane przez te funkcje przyjmuja wartosci od 0 do 255 (zreszta w zmiennej typu char tez mozna zapisywac tylko wartosci z tego przedzialu) a EOF najczesciej przyjmuje -1 wiec logicznie rozumujac -1 nie powinno byc zapisywane w zmiennej znakowej bo ta moze przyjmowac warosci tylko z zakresu 0-255 a -1 znajduje sie ponizej tej granicy. przytocze jeszcze cytat z ksiazki helionu "Jezyk C. Wskazniki. Vademecum profesjonalisty" Czesto zadawanym pytaniem jest: dlaczego zmienna zn jest zadeklarowana jako int, choc jest uzywana do odczytu znakow? odpowiedz na nie brzmi: pozniewaz EOF jest wartoscia calkowita, ktora wymaga wiecej bitow niz jest dostepne w zmiennej znakowej; pozwala to zapobiegac przypadkowej interpretacji odczytanego znaku jako warosci EOF. Ale oznacza to rowniez, ze zmienna zn, ktora jest uzywana do odczytywania znakow, musi byc na tyle szeroka, aby mogla przechowywac rowniez wartosc EOF, i dlatego stosujemy wartosc calkowita. o do tej stalej EOL to jesli to jest \r\n to nie za bardzo mozna ja stosowac w plikach bo tam raczej nie wystepuje \r ( po co komu w pliku znak powrotu karetki? ). przynajmniej ja sie z tym nie spotkalem a przejscie do nowej linii bylo wykonywane tylko i wylacznie poprzez znak \n. A przyglądałeś się dokładnie jakiemuś plikowi zapisanemu pod Windowsem? Chyba nie icon_smile3.gif czytaj uwazniej!!! ok doczytalem o EOL i dowiedzialem sie tego ze EOL pod winshitem to \r\n a pod linuxem to samo \n. ( ja programuje pod linuxem wiec zapewne dlatego nie spotkalem sie z kombinajcja \r\n, to tak dla sprostowania ;p ) to bylo napisane kilka postow nizej. :blink: btw. jesli EOL to \r\n to oznaczalo by to ze najpierw znak karetki powraca na poczatek dopiero nastepnie nastepuje przejscie do nowej linii, czyli w sumie to przesunelibysmy biezaca linijke o jedna do dolu. (mam nadzieje ze za bardzo nie pobladzilem w moim rozumowaniu :/) Nie, bo '\n' to new line, a nie jakieś move line to next line czy cokolwiek innego. '\n' jedynie przesuwa karetkę w dół. oops moj blad. thx za wyjasnienie. P.S. ty to ten mina86 z forum.slackware.pl ? Edytowane 23 Września 2005 przez enzo Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
mina86 Opublikowano 25 Września 2005 Zgłoś Opublikowano 25 Września 2005 chociazby dlatego ze jak chlopak stawia dopiero piersze kroki w C i zacznie mieszac rozne funkcje przeznaczone do czego innego to moze pozniej miec przez to problemy przy pisaniu jakis innych progsow.Przyznaję, jest to pewien argument. hym... wlasnie sam sobie zaprzeczyles. Przeanalizujmy całą wymianę zdań: napewno nie ma a przynajmniej nie do uzycia w funkcji czytajacej znak po znaku Bo \r\n to 2 bajty wiec niby jak on ma sprawdzic czy char c == "\r\n" ? @ Nargil to ze ta stala ma 2 bajty nic nie przekresla, bo np EOF tez ma wiecej niz 1 bajt. jakbys sie dokladnie przyjrzal prototypom funkcji znakowego wejsci-wyjscia zauwazylbys ze one zwracaja int'y. dlatego jesli zczytuje sie znaki z pliku nalezy kozystac nie z char'ow tylko z int'ow. Z tych dwóch wypowiedzi wyciągnąć należy wniosek, jakoby EOL miał 2 bajty (konkretnie "\r\n"[1]), a przy pomocy getchar() można porównać czy odczytany znak (?!) to "\r\n"... Chyba przyznasz, że to nie prawda? zreszta w zmiennej typu char tez mozna zapisywac tylko wartosci z tego przedzialuGwoli ścisłości, to zależy od ustawień kompilatora - zazwyczaj char jest zmeinną ze znakiem, a więc można w nim przechowywać wartości z przedziału: -128..127. to bylo napisane kilka postow nizej.Wybacz lenistwo, ale gdy do tego doczytałem to już nie chciało mi się poprawiać ;) P.S. ty to ten mina86 z forum.slackware.pl ?Owszem. [1] chociaż tak prawdę mówiąc "\r\n" to w C 3 bajty: '\r' (CR), '\n' (NL) i '\0' (NUL). Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
enzo Opublikowano 25 Września 2005 Zgłoś Opublikowano 25 Września 2005 widze ze to ja nie dopilnowalem pewnych szczegolow no ale nic teraz postaram sie to naprawic. a wiec zacznijmy pokolei hym... wlasnie sam sobie zaprzeczyles.tutaj chodzilo mi o to ze chcesz zapisac wartosc -1 w zmiennej operujacej na liczbach z zakresu 0-255. Gwoli ścisłości, to zależy od ustawień kompilatora - zazwyczaj char jest zmeinną ze znakiem, a więc można w nim przechowywać wartości z przedziału: -128..127.oczywiscie ze tak. ja przyjolem zalozenie ze jesli mowimy w tym topicu o char'ach to w rzeczywistosci chodzi nam o typ unsigned char. Z tych dwóch wypowiedzi wyciągnąć należy wniosek, jakoby EOL miał 2 bajty (konkretnie "\r\n"[1]), a przy pomocy getchar() można porównać czy odczytany znak (?!) to "\r\n"... Chyba przyznasz, że to nie prawda?no i tutaj musze sie przyznac do drobnego (a moze i nie tak calkiem drobnego) przeoczenia, a mianowicie tak bardzo skoncentorwalem sie na miejscu zajmowanym przez EOL w pamieci ze nie zauwazylem ze w pliku moze byc reprezentowana przez wiecej niz jeden znak. ok teraz przejdzmy do getchar(). przyznaje ze za pomoca tej funkcji nie mozna wykonac porownania do \r\n gdyz sa to dwa znaki. [1] chociaż tak prawdę mówiąc "\r\n" to w C 3 bajty: '\r' (CR), '\n' (NL) i '\0' (NUL).hym, chodzi ci o to ze EOL to ciag \r\n\0 ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
antrykot111 Opublikowano 25 Września 2005 Zgłoś Opublikowano 25 Września 2005 mina86: Czy jesteś pewien że EOL ma na końcu 0 ? Właściwie po co ono ma tam być. W stringu w pamięci jest po to aby było widomo gdzi sie kończy. Ale po co on ma być w pliku ? Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Nargil Opublikowano 25 Września 2005 Zgłoś Opublikowano 25 Września 2005 EOL nie ma \0 na koncu... lol, ale sie dyskusja rozwinela :) a co do NEW w moim przykladzie to fakt przeoczenie :) Juz poprawiam const int rozmiar = 100;char *buf = (char*)malloc(rozmiar+1);int i=0;FILE fp = fopen("plik.txt", "rb");while(fscanf(fp, "%c", &buf[i])>=0 && i<rozmiar) i++; oczywiscie za pomoca fseek i ftell mozemy odczytac rozmiar pliku i ustawic odpowiednio zmienna rozmiar, a nastepnie skozystac z rewind :) mina86 napisal: Należy sprawdzać czy c == '\n'. ja nie twierdze ze tak sie nie robi, ale po co miec smiecia \r w linii ? Ja bym porownywal \r i przeskakiwal o 1 byte dalej do przodu ( omijajac \n ) Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
Polar Opublikowano 26 Września 2005 Zgłoś Opublikowano 26 Września 2005 No dobra uściślijmy nieco: 1. W programie '\n' ma jeden bajt, bo to pojedynczy znak "\n" ma 2 bajty, bo dochodzi tu znak końca stringu "\r\n" ma 3 bajty, bo tu też dochodzi znak końca stringu Chodzi tu tylko o program i cała teorię napisów "..." i '.', co wcale nie oznacza że w pliku jest tak samo. 2. Pliki KAŻDY ZNAK '\n' lub "\n" napotkany przy zapisie do pliku jest zmieniany w na 2 znaki '\r'+'\n' które ZAWSZE!!! kończą linię tekstu w pliku tekstowym. A przy odczycie pliku każde wystąpienie znaku '\r'+'\n' jest zmieniane na znak '\n' , który to znak trafia do programu. I TU JEST UKRYTA CAŁA TAJEMNICA z rozmiarem i możliwością porównań znaków odczytanych z pliku a znaków w programie. Bez tych ukrytych zmian nie można by było tak prosto robić róznych rzeczy. Najlepej jest zachować zasadę że przy zapisie do pliku tekstowego chcąc zejśc linie niżej uzywamy ( andl lub '\n' lub "\n" ) te 3 znaki są traktowane tam samo przy zapisie do pliku, mimo że w programie jest/może być inaczej. Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
mina86 Opublikowano 26 Września 2005 Zgłoś Opublikowano 26 Września 2005 (edytowane) tutaj chodzilo mi o to ze chcesz zapisac wartosc -1 w zmiennej operujacej na liczbach z zakresu 0-255.Ależ ja nic takiego nie chcę czynić. Opisałem jedynie co zwraca funkcja getchar() hym, chodzi ci o to ze EOL to ciag \r\n\0 ?Nie, jedynie stwierdzam, że w C/C++ zapis: "\r\n" to są 3 bajty. Ma to luźne powiązanie z właściwym tematem tego wątku. ja nie twierdze ze tak sie nie robi, ale po co miec smiecia \r w linii ? Ja bym porownywal \r i przeskakiwal o 1 byte dalej do przodu ( omijajac \n )To może w niekórych przypadkach nie zadziałać poprawnie. Pierwsze co mi przychodzi do głowy to gdybyś chciał operować na wyjściu jakiegoś programu, który faktycznie używa '\r' do powrotu na początek linii (żeby ją potem czymś nadpisać). Poza tym, wydaje mi się, że w przypadku otwierania pliku w trybie tekstowym (tj. nie binarnym) biblioteka sama dokonuje konwersji pomiędzy "\r\n" a '\n'. Edytowane 26 Września 2005 przez mina86 Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...
enzo Opublikowano 26 Września 2005 Zgłoś Opublikowano 26 Września 2005 ok wyjasnijmy wszystko dokladnie to ze ta stala ma 2 bajty nic nie przekresla, bo np EOF tez ma wiecej niz 1 bajt. jakbys sie dokladnie przyjrzal prototypom funkcji znakowego wejsci-wyjscia zauwazylbys ze one zwracaja int'y. dlatego jesli zczytuje sie znaki z pliku nalezy kozystac nie z char'ow tylko z int'ow. Muahahahahaha.. Dobry joke icon_wink2.gif Owszem, zwraca inty, ale przyjmują one jedynie wartości od 0 do 255 jeżeli odczytano znak lub EOF (najczęściej -1) gdy napotkano na koniec pliku. no i jedziemy z koksem, a wiec zapewne zle zrozumiales o co mi chodzilo w tej mojej wypowiedzi co jest wina mojego gapiostwa (i marnej znajomosci polskiego ;p). chyba pomyslales sobie ze nalezy stosowac int'y bo funkcje znakowego wejscia-wyjscia zwracaja wlasnie int'y. a mi chodzilo o to ze nalezy sotoswac int'y bo niektore stale takie jak EOF nie moga byc zapisane w zmiennej typu char. nastepnie twoja wypowiedz nakierowala moj tok rozumowania tak ze wydawalo mi sie ze nie wierzysz ze stalej EOF nie mozna zapisac w zmiennej typu char co z kolej pchnelo mnie do napisania: hym... wlasnie sam sobie zaprzeczyles.oraz pozniej: tutaj chodzilo mi o to ze chcesz zapisac wartosc -1 w zmiennej operujacej na liczbach z zakresu 0-255.a wiec przyznaje sie do bledow bez bicia ;p no i nie ma tego zlego co by na dobre nie wyszlo. :] Cytuj Udostępnij tę odpowiedź Odnośnik do odpowiedzi Udostępnij na innych stronach Więcej opcji udostępniania...