Diskuze: čtení ze souboru nefunguje
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 11 zpráv z 11.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
FILE * p_soubor ??? neznám syntax C ale toto je podezřelé
aha díky.. tak pak mne napadá třeba, že máš v procesech řádně
neukončený Test2.exe, který už má soubor otevřen, takže ho nemůžeš
otevřít znovu? nebo ho máš otevřen jiným programem? ale jen hádám, sám
se nechám překvapit, někým, kdo C více rozumí
[quote]
FILE * p_soubor
[/quote]
Tohle je v pořádku.
Co znamená, že ti ten soubor nejde načíst? Selže fopen? Nebo až fgets? Nebo se zdánlivě vše načte, ale data jsou jiná, než očekáváš?
Než-li načtení dat ze souboru, je chyba s jeho otevřením. Pokud Ti vše fungovalo, zkontroluj si cestu k souboru. Dost možná si ho v euforii přesunul z adresáře ve kterém máš zdrojový soubor do adresáře se spustitelným souborem. Popřípadě nechtěně přejmenoval. Další chyby, které už spíše souvisí se zprovozněním aplikace je duplicitní přípona při vytváření textového souboru a opět cesta k souboru. Počet současně otevřených souborů je natolik velký, že chyba tohoto rázu to dost pravděpodobně nebude. Některé překladače mohou mít problém s tím, že aplikace nebyla řádně ukončena a "visí" v procesech. Nová instance aplikace pak nelze spustit. Mohou nastat samozřejmě nějaké další chyby, i na straně QT. Může pomoci i restart.
Jelikož se jedná chybu otevření souboru, otestuj si to na osekané verzi.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fp = fopen("input.txt", "r");
if (!fp) {
fprintf(stderr, "Soubor se nepodarilo otevrit.\n");
exit(1);
}
printf("Soubor byl uspesne otevren, zaviram.\n");
fclose(fp);
return 0;
}
Dále pár rad ke kódu:
Pokud funkce nemá parametry, používej klířové slovo void. Tvoříš v C, nikoli v C++ kde je definováno jak má vypadat funkce bez parametrů. Popř. používej funkci main() ve tvaru přebírající parametry.
int main(int argc, char *argv[])
Používej direktivu preprocesoru #define pro pevné hodnoty. Snáze se vyvaruješ chybám že někde opomeneš změnit nějakou hodnotu a udržíš program čitelný.
Pokud není splněna podmínka, vypiš hlášku a někam to směřuj (ukončení programu, opětovné načtení vstupu, atd.). else blok je zbytečný, způsobí akorát hlubší zanoření a ubereš na čitelnosti.
Není na škodu oddělovat deklarační část od samotného kódu prázdnou řádkou, opět z důvodu lepší čitelnosti.
Děkuji za dlouhé odpovědi.
input.txt mám ve stejné složce jako celý projekt.
Qt hlásí tohle. Selhává tedy fopen.
"23:59:49: Starting C:\QtWorkplace\build-Test2-Desktop-Debug\Test2.exe...
Invalid parameter passed to C runtime function.
Invalid parameter passed to C runtime function.
Soubor se nepodarilo otevrit pro cteni
23:59:50: C:/QtWorkplace/build-Test2-Desktop-Debug/Test2.exe exited with code
0"
Tento text se na zminovane strance nevyskytuje. Takze mas nejspis vlastni kod. Na tvou obrazovku nevidime.
Pokud tam mas tenhle kod, tak to je dost pochybny zapis.
FILE * p_soubor = fopen("dopis.txt", "r");
if (p_soubor == NULL)
{
printf("Soubor se nepodařilo otevřít pro čtení, zkontrolujte prosím zda existuje.");
return 1;
}
Fopen muze selhat z ruznych pricin. Autor kodu tam mel minimalne pridat vypis chyby. No, zkusim neco vygooglovat, treba ti to k necemu bude.
google = cpp fopen print error code
http://www.cplusplus.com/…stdio/fopen/
/* fopen example */
#include <stdio.h>
int main ()
{
FILE * pFile;
pFile = fopen ("myfile.txt","w");
if (pFile!=NULL)
{
fputs ("fopen example",pFile);
fclose (pFile);
}
return 0;
}
Koukam, ze je to tak i na ostatnich strankach. Nastesti google zobrazi vic
odkazu
https://stackoverflow.com/…h-errno-is-2
#include <stdio.h>
#include <errno.h>
int main(void) {
char debugText [256];
FILE *dfile;
sprintf (debugText, "C:\\List.txt");
dfile = fopen( debugText, "w");
if (dfile == NULL) {
printf("fopen failed, errno = %d\n", errno);
}
else {
printf("fopen succeeded\n");
}
return 0;
}
Je tam i link na tabulku s error kody pro linux. Pro win se to muze lisit,
ale.
https://www.thegeekstuff.com/…error-codes/
https://en.cppreference.com/w/c/io/fopen
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE* fp = fopen("test.txt", "r");
if(!fp) {
perror("File opening failed");
return EXIT_FAILURE;
}
https://www.tutorialspoint.com/…handling.htm
#include <stdio.h>
#include <errno.h>
#include <string.h>
extern int errno ;
int main () {
FILE * pf;
int errnum;
pf = fopen ("unexist.txt", "rb");
if (pf == NULL) {
errnum = errno;
fprintf(stderr, "Value of errno: %d\n", errno);
perror("Error printed by perror");
fprintf(stderr, "Error opening file: %s\n", strerror( errnum ));
} else {
fclose (pf);
}
return 0;
}
Jo, a jak pisou ostatni, tech pricin muze byt spoustu.
Na Google se nespoléhej, je tam příliš mnoho chyb a špatných zápisů. Ty hlavně musíš vědět co a jak proč funguje. Použij toto:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
extern int errno;
int main(void) {
FILE *fp = fopen("input.txt", "r");
if (!fp) {
perror("Popis chyby");
printf("Cislo chyby: %d\n", errno);
exit(1);
}
printf("Soubor byl uspesne otevren, zaviram.\n");
fclose(fp);
return 0;
}
Děkuji. zkusil jsem na jiném PC a nešlo to, napadlo mě tam dát
absolutní cestu a už to jde. Uvidím co na NTB.
Zobrazeno 11 zpráv z 11.