Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
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
Surikata
Člen
Avatar
Surikata:10.4.2019 17:07

Ahoj,nejde mi buď čtení nebo zápis do souboru.

Zkusil jsem: Zkoušel jsem různé tutoriály, ale pořád sem měl ten stejný problém.

Chci docílit: Znažím se dosáhnout toho, aby program četl ze vstupního souboru a zapisoval do výstupního.

#include<iostream>
#include <fstream>

using namespace std;

int main()
{
        char  ch;
        int i, key;
        char vstup [100];
        char vystup [100];



        cout << "Enter file for encrypt: ";
        cin >> vstup;    // input
        ifstream myfile (vstup);  // input
        cout << "Name of file to write encrypt: ";
        cin >> vystup;    // output
        ofstream fout (vystup,ios::out);
        if (myfile.is_open())
    if (fout)
{


        cout << "Enter key: ";
        cin >> key;

        for(i = 0; vystup[i] != '\0'; ++i){
                ch = vystup[i];

                if(ch >= 'a' && ch <= 'z'){
                        ch = ch + key;

                        if(ch > 'z'){
                                ch = ch - 'z' + 'a' - 1;
                        }

                        vystup[i] = ch;
                }
                else if(ch >= 'A' && ch <= 'Z'){
                        ch = ch + key;

                        if(ch > 'Z'){
                                ch = ch - 'Z' + 'A' - 1;
                        }

                        vystup[i] = ch;
                cin >> vystup;

                }
        }
        cout << "Encrypted message: " << vystup;
        }


        else
                cout << "File failed to open!\n";
        return 1;
}
 
Odpovědět
10.4.2019 17:07
Avatar
Kenvil
Člen
Avatar
Kenvil:10.4.2019 22:50

Problém je v tom, že ty otevřeš soubor pro zápis ale už ho neuzavřeš a chceš po programu aby z něj četl. Druhá věc, nic neukládáš do textového souboru. Další věc pro výstup textu používáš cin >> vystup (předpokládám že ses asi přepsal) má tam být cout

string line;
string jmeno_txt;
string pripona = ".txt"
string cele_jmeno;

cin >> jmeno_txt;

cele_jmeno = jmeno_txt + pripona;

// Pro zápis
ofstream myfile  (cele_jmeno);
if (myfile.is_open())
{
  myfile << "Zde je můj text";
  myfile.close();

}

else cout << "Nejde otevrit";




// Pro čtení
  ifstream myfile (cele_jemno);
  if (myfile.is_open())
  {
    while ( getline (myfile,line) )
    {
      cout << line << '\n';
    }
    myfile.close();
  }

  else cout << "Nejde otevrit";
Editováno 10.4.2019 22:53
 
Nahoru Odpovědět
10.4.2019 22:50
Avatar
Surikata
Člen
Avatar
Odpovídá na Kenvil
Surikata:11.4.2019 10:15

Mám trošku problém. Nevim jak to mam napasovat do kodu aby to bylo funkční a abych nemusel program moc překopávat.

 
Nahoru Odpovědět
11.4.2019 10:15
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Surikata
DarkCoder:11.4.2019 13:32

Je třeba naučit se, jak si rozdělit tvorbu aplikace na dílčí části. Jen tak můžeš rychle, efektivně a bez nervů najít příčinu chyby. Odpadne tak obecné konstatování o chybě podobné tomuto:

nejde mi buď čtení nebo zápis do souboru.

Je třeba vědět kde přesně chyba může být. Bude chyba v inicializaci souborového systému, v načítání dat ze souboru, v manipulaci s daty nebo v zápisu dat do souboru nebo někde jinde?

Postupuj systematicky, využívej podmíněného překladu (instrukcí, direktiv a operátoru preprocesoru) ve kterém si vypisuj aktuální stavy dílčích částí.

Nahoru Odpovědět
11.4.2019 13:32
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Kenvil
Člen
Avatar
Odpovídá na Surikata
Kenvil:12.4.2019 9:09

Vytvoř dvě funkce, jedna pro čtení druhá pro zápis a pak můžeš udělat funkci co převezme text pro editaci. A zase jí můžeš předávat do funkce pro zápis. Není nic horšího než všechno zaplacat do jedné funkce. A jak zmínil DarkCoder vše si rozděluje, dělej si popisky co danà funkce dělá. Ještě bych doplnil aby sis zkoušel psát testy pro svoje funkce, usnadní ti to život :)

 
Nahoru Odpovědět
12.4.2019 9:09
Avatar
Surikata
Člen
Avatar
Odpovídá na DarkCoder
Surikata:12.4.2019 17:26

No to kde je chyba nevím a ani nevím jak to zjistit. Na jednom foru mi řekli, že chyba je v části čtení programu a nic víc. Bohužel nevím co mi chcete vaším komentářem říct. "Postupuj systematicky, využívej podmíněného překladu (instrukcí, direktiv a operátoru preprocesoru) ve kterém si vypisuj aktuální stavy dílčích částí."

 
Nahoru Odpovědět
12.4.2019 17:26
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Surikata
DarkCoder:12.4.2019 21:24

Každý někdy udělá chybu. Odhalit pak její příčinu je nezbytná dovednost programátora. Na něm je psát programy tak, aby splnily požadavky, které se od něj očekávají - aby byl uživatelsky jednoduchý a přátelský, výkonný, robustní a snadno modifikovatelný. Zejména je třeba klást důraz právě na robustnost a na to, aby v případě nenadálé události uživatel získal patřičné informace. Robustnost spočívá ve spolehlivosti a odolání mnoha vlivů jako jsou všemožné uživatelské vstupy. Uživatelská přívětivost zase v tom, aby uživatel dostal patřičné informace nutné k vyřešení té dané události. Program je třeba konstruovat tak, aby chyba byla snadno dohledatelná. Z čím menších částí se skládá, tím snáze se chyba najde a program odladí. K tomu pomáhají všemožné možnosti jazyka, které je dobré využívat (podmíněný překlad, funkce, soubory, komentáře, oddělený překlad, apod.). A pak schopnost programátora psát program tak aby měl správnou strukturu. Nic z toho není obtížné a dá se naučit...

Pro představu se podívej na následující příklad, který je obdobou tomu tvému. Jelikož je natolik jednoduchý, neobsahuje soubory, ani funkce. Můžeš si je ale vytvořit. Avšak při tvorbě velkých aplikací je použití souborů a funkcí nutnost. Zde je pochopení dáno zvýšeným výskytem komentářů, využití podmíněného překladu, kontrolním výpisem všeho potřebného a potřebnou strukturou. Tam kde je třeba je provedena kontrola chyb. Rozdělení celého programu na malé části pomáhá odhalit případnou chybu velmi rychle. Zde je vidět, že v programu, který ač má jen pár důležitých částí, je velká část kódu věnována ladění. Tak to prostě je a bude a ladění programu tak ber jako nezbytnou část tvorby aplikací. To že zabere nemalou část času je pravda, ale veškeré úsilí věnované právě ladění se Ti později bohatě vrátí.

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

#define MODE 1 // 0 - release, 1 - debug

int main(void) {
        long filelen;
        unsigned char *data = NULL;
        FILE *fpin = NULL;
        FILE *fpout = NULL;
        int i;

#if (MODE)
        printf("Program bezi v DEBUG modu.\n\n");
#endif

        // otevreni souboru input.txt pro cteni
        fpin = fopen("input.txt", "rb");
        if (!fpin) {
                fputs("Chyba pri otevirani souboru input.txt", stderr);
                exit(1);
        }

        // zjisteni velikosti souboru input.txt
        fseek(fpin, 0L, SEEK_END);
        filelen = ftell(fpin);

#if (MODE)
        // Kontrolni vypis velikosti souboru input.txt
        printf("Velikost souboru input.txt: %ld bytu\n", filelen);
#endif

        // nastaveni pozice v souboru input.txt na zacatek
        rewind(fpin);

        // alokace pameti pro data v souboru input.txt
        // vcetne null znaku
        data = (unsigned char *)malloc(filelen + 1);
        if (!data) {
                fputs("Chyba alokace pameti", stderr);
                exit(1);
        }

        // nacteni souboru input.txt do pameti
        if (fread(data, 1, filelen, fpin) != filelen) {
                fputs("Chyba nacteni dat ze souboru", stderr);
                exit(1);
        }

        // Ukonceni retezce null znakem
        data[filelen] = '\0';

        // Uzavreni souboru input.txt
        if (fclose(fpin)) {
                fputs("Chyba pri uzavirani souboru input.txt", stderr);
                exit(1);
        };

#if (MODE)
        // Kontrolni vypis dat z pameti
        puts("\nData pred modifikaci: ");
        puts(data);
#endif

        // Modifikace dat - napr. zamena cislic za *
        for (i = 0; i < filelen; i++) {
                if (isdigit(data[i])) data[i] = '*';
        }

#if (MODE)
        // Kontrolni vypis dat z pameti
        puts("\nData po modifikaci: ");
        puts(data);
#endif

        // otevreni souboru output.txt pro zapis
        fpout = fopen("output.txt", "wb");
        if (!fpout) {
                fputs("Chyba pri otevirani souboru output.txt", stderr);
                exit(1);
        }

        // Zapis dat do souboru output.txt
        if (fwrite(data, filelen, 1, fpout) != 1) {
                fputs("Chyba zapisu dat do souboru", stderr);
                exit(1);
        }

        // Uzavreni souboru output.txt
        if (fclose(fpout)) {
                fputs("Chyba pri uzavirani souboru output.txt", stderr);
                exit(1);
        };

        // Uvolneni alokovane pameti pro data
        free(data);
        data = NULL;

        return 0;
}
Nahoru Odpovědět
12.4.2019 21:24
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Kenvil
Člen
Avatar
Odpovídá na Surikata
Kenvil:13.4.2019 21:37

Vždyť sem ti vypsal kde máš chyby + ti poslal kód, stačí si do něho dopsat funkci pro tvojí šifru ... (aspoň takto sem pochopil tvůj pokus)

 
Nahoru Odpovědět
13.4.2019 21:37
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 8 zpráv z 8.