Java týden
Procvič si angličtinu zdarma s naším americkým e-learningem! Learn more
Pouze tento týden sleva až 80 % na celý Java e-learning!
Avatar
Tomáš Hanzelka:20. února 18:16

Nejdou mi načíst data ze souboru, sranda je, že mi to ještě před pár pokusy šlo, ale nyní mi to ze záhadného důvodu nefunguje

Zkusil jsem: Restart Qt, vytvořit nový projekt a znovu zkusit ze souboru načíst

Chci docílit: Načíst data ze txt souboru

 
Odpovědět 20. února 18:16
Avatar
Tomáš Novotný:20. února 20:10

FILE * p_soubor ??? neznám syntax C ale toto je podezřelé :-)

Nahoru Odpovědět 20. února 20:10
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Tomáš Novotný:20. února 20:21

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í :)

Nahoru Odpovědět 20. února 20:21
∞ ... the exact amount of possibilities how to deal with the situation ... so by calm, your solution is one of many
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Tomáš Novotný
Martin Dráb:20. února 21:22

[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áš?

Nahoru Odpovědět 20. února 21:22
2 + 2 = 5 for extremely large values of 2
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Tomáš Hanzelka
DarkCoder:20. února 21:48

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.

Nahoru Odpovědět 20. února 21:48
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Tomáš Hanzelka:21. února 0:02

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\bu­ild-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/bu­ild-Test2-Desktop-Debug/Test2.exe exited with code 0"

 
Nahoru Odpovědět 21. února 0:02
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21. února 15:58
  1. https://www.itnetwork.cz/…vymi-soubory
  2. ctrl+f
  3. Soubor se nepodarilo otevrit pro cteni

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;
}
Editováno 21. února 15:59
 
Nahoru Odpovědět 21. února 15:58
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21. února 16:02

Jo, a jak pisou ostatni, tech pricin muze byt spoustu.

  • Muze ti bezet program z predchoziho pokusu a drzet otevreny soubor (ctrl+shift+esc, spravce procesu). Proto se pouziva fclose, ze? :)
  • Muzes mit soubor otevreny jinym programem (text editor, word)
  • spatna cesta
  • spoustu dalsich, viz ten link na error codes pro linux (tu chybu by ti melo qt nekde vypsat, mozna v jinem okenku)
 
Nahoru Odpovědět 21. února 16:02
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Tomáš Hanzelka
DarkCoder:21. února 17:05

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;
}
Nahoru Odpovědět 21. února 17:05
"„Učíš-li se proto, aby sis zapamatoval, zapomeneš. Učíš-li se proto, abys porozuměl, zapamatuješ si."
Avatar
Tomáš Hanzelka:21. února 18:24

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. :)

 
Nahoru Odpovědět 21. února 18:24
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 11 zpráv z 11.