Thread View: pl.comp.os.linux.programowanie
6 messages
6 total messages
Started by michiuiu
Wed, 09 Mar 2011 08:33
C - wczytywanie dużej listy słów z pliku
Author: michiuiu
Date: Wed, 09 Mar 2011 08:33
Date: Wed, 09 Mar 2011 08:33
69 lines
2129 bytes
2129 bytes
Cześć
Próbuję napisać taki prosty program, który będzie wczytywał z pliku
(powiedzmy 100k do 1mln linii) listę słów.
Ma je pamiętać w jakieś tablicy 1d albo w strukturze, obojętnie.
Program wygląda narazie tak:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct {
char text[14];
} word;
word record[100000];
int main() {
FILE *f;
char line[14];
char *item;
int reccount = 0;
int i;
if (f = fopen("plik1", "r")) {
while (fgets(line, 13, f)) {
printf("%s",line);
item = strtok(line, "\n");
strcpy(record[reccount].text, item);
printf("%s\n", record[reccount].text);
reccount++;
}
fclose(f);
}
for (i=0; i<reccount; i++) {
printf("%s\n",record[i].text);
}
}
A plik "plik1" tak:
kae8koh1Eisi
EkaiLa4ao8ci
GaeRup9vevoo
ojohwu7ooKai
na9TohTaixei
eiqu5VulioCh
caechi0Aevoo
ku5iu8ahYo6s
nut1aa2Iawie
qui8eeFaeth4
iXooropi5rah
eeHef1TooSei
[...]
Tyle że ma np. 100 tysięcy linii.
No i gdy go odpalam, to się wywala:
$ ./w
kae8koh1Eisikae8koh1Eisi
Segmentation fault
$
Ma ktoś jakiś pomysł co jest nie tak?
I nie bijcie proszę, bo dopiero zaczynam naukę programowania :(
michiuiu.
Re: C - wczytywanie dużej listy słów z pliku
Author: Mariusz Kruk
Date: Wed, 09 Mar 2011 08:47
Date: Wed, 09 Mar 2011 08:47
12 lines
1111 bytes
1111 bytes
epsilon$ while read LINE; do echo \>"$LINE"; done < "michiuiu"
> printf("%s\n",record[i].text);
[...]
>Ma ktoś jakiś pomysł co jest nie tak?
To.
--
d'`'`'`'`'`'`'`'`'`'`'`'`'Yb
`b Kruk@epsilon.eu.org d'
d' http://epsilon.eu.org/ Yb
`b,-,.,-,.,-,.,-,.,-,.,-,.d'
Re: C - wczytywanie dużej listy słów z pliku
Author: Adam Osuchowski
Date: Wed, 09 Mar 2011 08:51
Date: Wed, 09 Mar 2011 08:51
21 lines
1527 bytes
1527 bytes
michiuiu wrote:
> while (fgets(line, 13, f)) {
Skoro masz 13-znakowe słowa to tutaj musisz mieć 14, a nie 13.
> item = strtok(line, "\n");
> strcpy(record[reccount].text, item);
Tutaj (zresztą nie tylko tutaj) wypadałoby sprawdzić co zwróci strtok().
> }
> }
Jak funkcja main() ma typ int to przydałoby się zwrócić jakąś wartość, nie?
> Ma ktoś jakiś pomysł co jest nie tak?
Przede wszystkich doczytaj _do_końca_ dokumentację do wszystkich funkcji,
których używasz. Często diabeł tkwi w szczegółach. Poza tym, jak już
wspomniałem, sprawdzaj wartość zwracaną przez każdą funkcję, która coś
zwraca, jeśli z tego dalej korzystasz.
Re: C - wczytywanie dużej listy słów z pliku
Author: Tomasz Sowa
Date: Fri, 18 Mar 2011 18:42
Date: Fri, 18 Mar 2011 18:42
24 lines
1380 bytes
1380 bytes
Dnia Wed, 09 Mar 2011 09:33:42 +0100, michiuiu napisał(a):
> No i gdy go odpalam, to się wywala:
> $ ./w
> kae8koh1Eisikae8koh1Eisi
> while (fgets(line, 13, f)) {
wczytalo sie: kae8koh1Eisi (plus zero na koncu)
> printf("%s",line);
> item = strtok(line, "\n");
\n nie został znaleziony i strtok zwraca null
> strcpy(record[reccount].text, item);
strcpy uzywa tego null i wywala program
Poprawiony kod: http://pastebin.com/UkzJCe40
--
Tomek
http://www.ttmath.org
Re: C - wczytywanie =??B?ZHXFvGVqIGxpc3R5IHPFgsOzdyB6IHBsaWt1?=
Author: acdwas
Date: Tue, 29 Mar 2011 18:50
Date: Tue, 29 Mar 2011 18:50
90 lines
2489 bytes
2489 bytes
michiuiu wrote:
> Cześć
>
> Próbuję napisać taki prosty program, który będzie wczytywał z pliku
> (powiedzmy 100k do 1mln linii) listę słów.
> Ma je pamiętać w jakieś tablicy 1d albo w strukturze, obojętnie.
>
> Program wygląda narazie tak:
>
> #include <stdio.h>
> #include <string.h>
> #include <stdlib.h>
>
> typedef struct {
> char text[14];
> } word;
> word record[100000];
>
> int main() {
>
> FILE *f;
> char line[14];
> char *item;
> int reccount = 0;
> int i;
>
> if (f = fopen("plik1", "r")) {
> while (fgets(line, 13, f)) {
lepiej stosowac fgets(line,sizeof(line),f)
> printf("%s",line);
-> wywal to
> item = strtok(line, "\n");
nie wiem po co ci to?
-> wywal to
> strcpy(record[reccount].text, item);
tu chyba chcesz dolaczyc '\n'?
zalatwilo to fgets. poczytaj (man fgets)
a jesli chcesz cos sklejac to poczytaj o strcat.
-> wywal to
> printf("%s\n", record[reccount].text);
> reccount++;
> }
> fclose(f);
> }
>
> for (i=0; i<reccount; i++) {
> printf("%s\n",record[i].text);
> }
> }
>
> A plik "plik1" tak:
> kae8koh1Eisi
> EkaiLa4ao8ci
> GaeRup9vevoo
> ojohwu7ooKai
> na9TohTaixei
> eiqu5VulioCh
> caechi0Aevoo
> ku5iu8ahYo6s
> nut1aa2Iawie
> qui8eeFaeth4
> iXooropi5rah
> eeHef1TooSei
> [...]
>
> Tyle że ma np. 100 tysięcy linii.
>
> No i gdy go odpalam, to się wywala:
> $ ./w
> kae8koh1Eisikae8koh1Eisi
>
> Segmentation fault
> $
>
> Ma ktoś jakiś pomysł co jest nie tak?
> I nie bijcie proszę, bo dopiero zaczynam naukę programowania :(
>
> michiuiu.
pozdr.
Re: C - wczytywanie dużej listy słów z pliku
Author: Dariusz
Date: Mon, 04 Apr 2011 08:40
Date: Mon, 04 Apr 2011 08:40
80 lines
2950 bytes
2950 bytes
On 9 Mar, 10:33, michiuiu <michi...@asdfasfda.asdf13er.pl> wrote:
> Cześć
>
> Próbuję napisać taki prosty program, który będzie wczytywał z pliku
> (powiedzmy 100k do 1mln linii) listę słów.
> Ma je pamiętać w jakieś tablicy 1d albo w strukturze, obojętnie.
>
> Program wygląda narazie tak:
>
> #include <stdio.h>
> #include <string.h>
> #include <stdlib.h>
>
> typedef struct {
> char text[14];} word;
>
> word record[100000];
>
> int main() {
>
> FILE *f;
> char line[14];
> char *item;
> int reccount = 0;
> int i;
>
> if (f = fopen("plik1", "r")) {
> while (fgets(line, 13, f)) {
> printf("%s",line);
> item = strtok(line, "\n");
> strcpy(record[reccount].text, item);
> printf("%s\n", record[reccount].text);
> reccount++;
> }
> fclose(f);
> }
>
> for (i=0; i<reccount; i++) {
> printf("%s\n",record[i].text);
> }
>
> }
>
> A plik "plik1" tak:
> kae8koh1Eisi
> EkaiLa4ao8ci
> GaeRup9vevoo
> ojohwu7ooKai
> na9TohTaixei
> eiqu5VulioCh
> caechi0Aevoo
> ku5iu8ahYo6s
> nut1aa2Iawie
> qui8eeFaeth4
> iXooropi5rah
> eeHef1TooSei
> [...]
>
> Tyle że ma np. 100 tysięcy linii.
>
> No i gdy go odpalam, to się wywala:
> $ ./w
> kae8koh1Eisikae8koh1Eisi
>
> Segmentation fault
> $
>
> Ma ktoś jakiś pomysł co jest nie tak?
> I nie bijcie proszę, bo dopiero zaczynam naukę programowania :(
>
> michiuiu.
przekroczyłeś rozmiar stosu
> word record[100000];
zapisz to w postaci wskaźnika i powinno być ok
Pozdrawiam
Dariusz
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads