Načtení dat ze souboru pomocí dynamického pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Načtení dat ze souboru pomocí dynamického pole – C / C++ – Fórum – Programujte.comNačtení dat ze souboru pomocí dynamického pole – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Matěj
~ Anonymní uživatel
18 příspěvků
1. 11. 2013   #1
-
0
-

Ahoj, napsal jsem program pro načtení dat ze souboru pomocí dynamického pole jako "bufferu", ale bohužel mi hází Debug Assertion chybu

File: f:\dd\vctools\crt_bld\self_x86\crt\src\close.c
Line: 48

Expression: (_osfile(fh) & FOPEN)

Byl bych vděčný za odhalení, co se za hláškou skrývá, vypadá to na chybu na heapu, takže špatná práce s pointrem?

Děkuji

#include <stdio.h>
#include <stdlib.h>

#define VELIKOST 1024
#define VELIKOSTHLEDANI 2

int main(){
	FILE *fr;
	int i,j,k,velikost,rozdil;
	int prubeh = 0;
	char *bufferstart;
	char *buff;
	char hledam[VELIKOSTHLEDANI];
	int vysledky[VELIKOSTHLEDANI];
	vysledky[0] = 0;
	vysledky[1] = 0;
	hledam[0] = 'a';
	hledam[1] = 'x';

	bufferstart = (char *)malloc(VELIKOST);
	buff = bufferstart;
	if(buff != NULL){
	fr = fopen("File.txt","r+b");
		if(fr != NULL){
			fseek(fr,0,SEEK_END);
			velikost = ftell(fr);
			fseek(fr,0,SEEK_SET);
			prubeh = velikost/VELIKOST;
			for(i = 0; i < prubeh;i++){
				buff = bufferstart;
				fread((void *)buff,sizeof(char),VELIKOST,fr);
					for(j = 0; j < VELIKOST; j++){
						for(k =0;k<VELIKOSTHLEDANIk++){
							if(*buff == hledam[k]){
								vysledky[k]++;
							}
						}
						buff++;
					}
			}
			rozdil = velikost % VELIKOST;
			fread((void*)buff,1,rozdil,fr);
			for(j = 0; j < rozdil; j++){
				for(k = 0;k<VELIKOSTHLEDANI;k++){
					if(*buff == hledam[k]){
						vysledky[k]++;
					}
				}
			buff++;
			}
		fclose(fr);
		}
	}
	printf("%c je zastoupeno poctem %d \n %c je zastoupeno poctem %d",hledam[0],vysledky[0],hledam[1],vysledky[1]);
	getchar();
	return 0;
}
Nahlásit jako SPAM
IP: 89.103.141.–
Reklama
Reklama
z
~ Anonymní uživatel
268 příspěvků
2. 11. 2013   #2
-
0
-

   

if(fr != NULL){
	...
	}
fclose(fr); // ???
Nahlásit jako SPAM
IP: 88.101.8.–
Matěj
~ Anonymní uživatel
18 příspěvků
2. 11. 2013   #3
-
0
-

#2 z
To je zavření souboru pokud není chyba při otevírání, pokud se nemýlím.

Nahlásit jako SPAM
IP: 89.103.141.–
z
~ Anonymní uživatel
268 příspěvků
2. 11. 2013   #4
-
0
-

Hlásí to chybu v close.c, tak jsem se zaměřil na ten fclose. Volá se vždycky, ať už otevření projde nebo ne.

Ale jak na to teď koukám, tak asi i přepisuješ data mimo ten buffer.

Nahlásit jako SPAM
IP: 88.101.8.–
z
~ Anonymní uživatel
268 příspěvků
2. 11. 2013   #5
-
0
-

Před čtením toho zbytku bys měl buff zase nastavit na bufferstart.

A celé by to šlo jednoduše napsat třeba takhle:

while (!feof(fr)) {
	nacteno = fread(buff, sizeof(char), VELIKOST, fr);
	if (nacteno < VELIKOST && ferror(fr)) {
		//oznamit chybu pri cteni
		break;
	}
	for (j = 0; j < nacteno, j++) {
		for (k = 0; k < VELIKOSTHLEDANI; k++) {
			if (buff[j] == hledam[k]) {
				vysledky[k]++;
			}
		}
	}
}
Nahlásit jako SPAM
IP: 88.101.8.–
Matěj
~ Anonymní uživatel
18 příspěvků
3. 11. 2013   #6
-
0
-

#5 z
No jo, já jsem nenastavil ukazatel na buffer zase na začátek při čtení toho zbytku. Děkuju moc.

Nahlásit jako SPAM
IP: 89.103.141.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 92 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý