Diskuze: program neplni funkci
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 8 zpráv z 8.
//= 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.
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";
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.
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í.
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
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í."
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;
}
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)
Zobrazeno 8 zpráv z 8.