Chyba při čtení z vytvořeného souboru – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Chyba při čtení z vytvořeného souboru – C / C++ – Fórum – Programujte.comChyba při čtení z vytvořeného souboru – C / C++ – Fórum – Programujte.com

 

Martin
~ Anonymní uživatel
1602 příspěvků
28. 11. 2014   #1
-
0
-

Zdravím, nejdříve sem si vytvořil program, který čte z již vytvořeného souboru čísla, která jsou napsaná vždy jedno na řádku a potom do druhého souboru pro zápis je napíše postupně nejdříve sudá potom lichá tedy vyberu sudá a zapíši je a pak skočím na začátek souboru vyberu lichá a zapíši je. 
Potom sem si chtěl program upravit tak abych si soubor, z kterého potom čtu vytvořil sám a sám do něj nastrkal hodnoty. Ale problém je v to, že poslední číslo, které zadám se načte dvakrát. 
Například mám čísla 1 2 3 4 5 (mezeru berte jako řádek) a ve výstupním souboru se mi napíše 2 4 1 3 5 5 tedy dvakrát ta 5. Jak tuto chybu opravit stále nemůžu zjistit, když sem si do souboru pro čtení sám nezapisoval v programu tak to bylo funkční. 
Zde je zdrojový kód:  

#include <fstream>
#include <iostream>

using namespace std;


int evenOdd ( const char * srcFileName, const char * dstFileName )
{
    int cislo;


    ifstream soubor1;
    soubor1.open(srcFileName,ios::in);

    ofstream soubor2;
    soubor2.open(dstFileName,ios::out);

    if(soubor1==0 || soubor2==0){
            cout<<"soubor se neotevrel"<<endl;
            return 1;
    }

    while(!soubor1.eof()) {
        soubor1>>cislo;
        if (cislo%2==0){
            soubor2<<cislo<<endl;
        }
    }

soubor1.clear();
soubor1.seekg(0, ios::beg);


      while(!soubor1.eof()) {
        soubor1>>cislo;
        if (cislo%2!=0){
            soubor2<<cislo<<endl;
        }
        }



    soubor1.close();
    soubor2.close();

      return 0;
}


int main ( int argc, char * argv [] )
 {
    int zapis;

     ofstream soubor;
      soubor.open("input.txt",ios::out);
      if(!soubor.is_open()){
            cout<<"soubor se neotevrel"<<endl;
            return 1;
      }
    for(int i=0;i<5;i++){
            cout<<"Napis cislo:"<<endl;
            cin>>zapis;
        soubor << zapis<<endl;
    }

soubor.close();

   evenOdd("input.txt", "output.txt");
   return 0;
 }


Nahlásit jako SPAM
IP: 83.240.13.–
KIIV
~ Moderátor
+43
God of flame
28. 11. 2014   #2
-
0
-

chyba je v tom, ze nekontrolujes, jestli se neco nacetlo

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin
~ Anonymní uživatel
1602 příspěvků
29. 11. 2014   #3
-
0
-

#2 KIIV
U této části:
 

for(int i=0;i<5;i++){
            cout<<"Napis cislo:"<<endl;
            cin>>zapis;
        soubor << zapis<<endl;
    }

A jak bych to provedl normálně pomocí cin.fail()?

Nahlásit jako SPAM
IP: 83.240.13.–
KIIV
~ Moderátor
+43
God of flame
29. 11. 2014   #4
-
0
-

#3 Martin

o cin tam nejde.. zkus zadat jako pate cislo misto 5 nejake sude, najednou tam bude napriklad  2 4 6 6 1 3  pro cisla  1 2 3 4 6

proste chyba je az dal.. pri tom nacitani ze souboru, ne z klavesnice

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin
~ Anonymní uživatel
1602 příspěvků
29. 11. 2014   #5
-
0
-

Aha a ošetřit by se to dalo jak? Nic sem nenašel. A jakto, že mi funguje když tam ty čísla nepíši takto ale tak, že si vytvořím texťák pro (input.txt) do něj dám čísla a funguje to.

Nahlásit jako SPAM
IP: 83.240.13.–
KIIV
~ Moderátor
+43
God of flame
29. 11. 2014   #6
-
0
-

#5 Martin
kdyz vytvaris soubor za behu, tak tam mas pokazdy cislo a ukonceni radku

kdyz vytvoris, tak nejspis za poslednim cislem zadny znak nemas (ani odradkovani), takze kdyz >> dojede na konec cisla, nastavi EOF.. pokud tam nejaky znak je, musi provest jeste jedno nacitani, kde mas predchozi hodnotu a jelikoz selze, tak se ta hodnota nezmeni a provede zapis

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin
~ Anonymní uživatel
1602 příspěvků
29. 11. 2014   #7
-
0
-

#6 KIIV
Takže chyba je to, že za posledním číslem v input.txt mám ještě endl a tím pádem se provede ještě jednou cyklus while s předchozí načtenou hodnotou, říkám to správně? Ajestli jo tak jak se dá zjistit zda to znovu načetlo číslo nebo ne? 

Nahlásit jako SPAM
IP: 83.240.13.–
KIIV
~ Moderátor
+43
God of flame
29. 11. 2014   #8
-
0
-

kdyz se nenacetlo, tak se da pouzit  souborx.fail()  nebo rovnou   if (souborx >> zapsat) .... (operator >> vraci referenci na ten vystupni stream a ma pretizeny operator pretypovani na bool, ktery vraci true jen v pripade, kdyz vsechno fungovalo)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Martin
~ Anonymní uživatel
1602 příspěvků
30. 11. 2014   #9
-
0
-

#8 KIIV
Děkuji mockrát :) Ještě  dotaz do budoucna. Tohle budu muset použít vždy, když si vytvořím vlastní soubor, který nebude končit znakem ale odřádkováním, že ano? Kdyby tam to odřádkování nebylo nemusel bych toto řešit,že? 

Nahlásit jako SPAM
IP: 83.240.13.–
KIIV
~ Moderátor
+43
God of flame
30. 11. 2014   #10
-
0
-

No spise vzdy.. proste libovolny znak za cislem pred koncem souboru znamena, ze se jeste nedorazilo ke konci souboru - tudiz neni nastaven EOF flag a jeste se o to pokusi znova.

Taktez kdyz ti nekdo zada misto cisla nejaky nesmysl - kdyz to nekontrolujes, tak se zacyklis v nekonecne smycce - pokus o nacteni cisla selze, nastavi fail bit a nikam se neposune. Kdyz je nastaven fail bit, tak uz >> nikdy nic nenacte, dokud ho nevynulujes.

Proste MUSIS kontrolovat stavy a v pripade fail bitu ho taky resetovat (pripadne jeste nacist jedno slovo, abys nestal na miste a nezkousel furt to same)

Nahlásit jako SPAM
IP: 94.113.95.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 35 hostů

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý