IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Avatar
Tomáš Hanzelka:20.2.2019 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.2.2019 18:16
Avatar
Tomáš Novotný:20.2.2019 20:10

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

Nahoru Odpovědět
20.2.2019 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.2.2019 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.2.2019 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
Tvůrce
Avatar
Odpovídá na Tomáš Novotný
Martin Dráb:20.2.2019 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.2.2019 21:22
2 + 2 = 5 for extremely large values of 2
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Tomáš Hanzelka
DarkCoder:20.2.2019 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.2.2019 21:48
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Tomáš Hanzelka:21.2.2019 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.2.2019 0:02
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21.2.2019 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.2.2019 15:59
 
Nahoru Odpovědět
21.2.2019 15:58
Avatar
Peter Mlich
Člen
Avatar
Peter Mlich:21.2.2019 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.2.2019 16:02
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Tomáš Hanzelka
DarkCoder:21.2.2019 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.2.2019 17:05
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Tomáš Hanzelka:21.2.2019 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.2.2019 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.