Přidat otázku mezi oblíbenéZasílat nové odpovědi e-mailem Nefunguje EOF

Dobrý den,
mám menší problém s programem v jazyce C.
Ze souboru txt načítám matici a vypisuji, ovšem z nějakého pro mě neznámého důvodu tento kód nepracuje tak jak bych chtěl:

int pruchod = 0;
char znak;
while(fscanf(file, "%c", &znak) != EOF){
	printf("%c", znak);
	pruchod++;
}

V souboru je matice:
4 5
0 0 1 1 1
0 0 1 0 1
1 0 1 1 1
1 1 1 1 1
kde 4 a 5 reprezentuje počet řádků a sloupců
jenže výpis mi dělá toto:
0 0 1 1 1
0 0 1 0 1
1 0 1 1 1
1 1 1 1 1 [zde se zobrazí divný znak]
a pak se vypíše: "Neoprávněný přístup do paměti (SIGSEGV) (core dumped [obraz paměti uložen])"
a program padne, z nějakého důvodu nefunguje podmínka pro EOF, nevíte prosím někdo co s tím?
Pokoušel jsem se i o obdobu s funkcí fgetc, ale dopadlo to stejně, prostě to padne na tom EOF.

Předmět Autor Datum
fscanf nevrací EOF. Musíš testovat ten přečtený znak. Lepší je použít funkci fgetc. fgetc nový
Niko Bellic 30.11.2013 22:34
Niko Bellic
preco pouzivas fscanf na znak? fgetc. nový
MM.. 30.11.2013 22:34
MM..
fscanf vracia pocet nacitanych znakov. Takze ked chces fscanf, tak testovat navratovu hodnotu oproti… nový
MM.. 30.11.2013 22:36
MM..
A ten neopravneny pristup do pamati je asi kvoli tomu ze mu tam davas pointer len na char, a on ti t… nový
MM.. 30.11.2013 22:39
MM..
No jo, ale když použiji funkci: int znak; while((znak = fgetc(file)) != EOF){ printf("%c", znak); p… nový
franta159 30.11.2013 22:51
franta159
nemoze to delat to stejny. Si to asi neskompiloval alebo spustas iny exe apod. nový
MM.. 30.11.2013 22:56
MM..
file si otvoril jak? nový
MM.. 30.11.2013 22:58
MM..
FILE *file = fopen(soubor_nazev,"r"); if(file==NULL){ tiskChyba(ERROR_FILE); return 0; }… nový
franta159 30.11.2013 23:02
franta159
Právě jsem nad tím seděl asi 5 hodin a už mě vážně nic nenapadá, zkoušel jsem i samostatnou funkci f… nový
franta159 30.11.2013 23:12
franta159
To co si sem dal s tym fgetc je OK, takze problem hladaj inde, ne v EOF. Pravdepodobne spustas uplne… nový
MM.. 30.11.2013 23:17
MM..
alebo daj si vypisovat %d a ne %c a uvidis co tam cita z toho suboru. Mozes si to aj porovnat so sub… nový
MM.. 30.11.2013 23:19
MM..
co mas v programe po tom while? Preco sem nedas cely zdrojak? nový
MM.. 30.11.2013 23:20
MM..
int nacti_matici(Bitmap *matice, const char *soubor_nazev){ int radky = 0; int sloupce = 0; FILE *fi… nový
franta159 30.11.2013 23:31
franta159
fgetc co to teda vypisuje? (a vyhod uplne to %c prec) preco nepouzijes debugger? nový
MM.. 01.12.2013 09:55
MM..
Co sa deje po navrate z funkcie nacti_matici ? Chjo. Chlpata deka. P.S. ked nevies pouzivat debugge… poslední
MM.. 01.12.2013 09:57
MM..

fscanf vracia pocet nacitanych znakov. Takze ked chces fscanf, tak testovat navratovu hodnotu oproti 0

Ak pouzivas kniznicne funkcie tak musis citat refernciu (napr. na msdn.microsoft.com alebo googgle: fscanf) a tam sekciu parametre a sekciu return value atd

Právě jsem nad tím seděl asi 5 hodin a už mě vážně nic nenapadá, zkoušel jsem i samostatnou funkci feof, prostě to projde celou matici a na konci to vypíše nějaký hranatý znak a pak neoprávněný přístup do paměti. Prostě z nějakýho nepochopitelnýho důvodu to neověří EOF, prostě to čte dál

int nacti_matici(Bitmap *matice, const char *soubor_nazev){
	int radky = 0;
	int sloupce = 0;
	FILE *file = fopen(soubor_nazev,"r");
	if(file==NULL){
		tiskChyba(ERROR_FILE);
		return 0;
	}
	if(fscanf(file,"%d%d",&radky,&sloupce)!=2)
	{
		tiskChyba(ERROR_MATICE_BAD);
		fclose(file);
		return 0;
	}
	if(rozmer_matice_param(sloupce, radky)==0){
		tiskChyba(ERROR_MATICE_BAD);
		fclose(file);
		return 0;
	}
	matice->radky = radky;
	matice->sloupce = sloupce;
	int pruchod = 0; 
	int znak;

	while((znak = getc(file))!=EOF){
		printf("%d-%c",znak, znak);
                pruchod++;
	}
	fclose(file);
	return 1;
}

Jde o funkci která má načtené hodnoty ukládat do pole, momentálně to dělá pouze výpis (pro kontrolu) no a tady jsem skončil, zkoušel jsem to různě upravit, ale prostě nic.
Ohledně spouštění exe, to bylo jedno z prvních co kontroluji, kdyby to byla taková prkotina, tak bych nad tím neseděl 5 hodin, popravdě jsem tak trochu už bezradnej, protože jsem vyčerpal své vědomosti (možnosti) a nemůžu s tím hnout. Pokusím se rozpochodovat ještě v jiným prostředí...

Zpět do poradny Odpovědět na původní otázku Nahoru