Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Matura 2012 zad4, program przestaje działać

Ostatnio zmodyfikowano 2013-10-28 21:25
Autor Wiadomość
Don_Corleone
Temat założony przez niniejszego użytkownika
Matura 2012 zad4, program przestaje działać
» 2013-10-27 11:51:51
Witam napisałem program do zadania 4 z matury z informatyki 2012(rozszerzona) lecz przy próbie jego uruchomienia program przestaje działać, szczegóły problemu:
  Nazwa zdarzenia problemu: APPCRASH
  Nazwa aplikacji: Matura 2012 zad 4.exe
  Wersja aplikacji: 0.0.0.0
  Sygnatura czasowa aplikacji: 526ceef4
  Nazwa modułu z błędem: ntdll.dll
  Wersja modułu z błędem: 6.0.6002.18881
  Sygnatura czasowa modułu z błędem: 51da3e27
  Kod wyjątku: c0000005
  Przesunięcie wyjątku: 00067f0d
  Wersja systemu operacyjnego: 6.0.6002.2.2.0.768.3
  Identyfikator ustawień regionalnych: 1045
  Dodatkowe informacje 1: e364
  Dodatkowe informacje 2: d135e63c20b27f8405159765009519be
  Dodatkowe informacje 3: f60e
  Dodatkowe informacje 4: ec2e3d2b5d9eca0fb2ece0975cd6be37

Kod:
C/C++
#include <iostream>
#include <string>
#include <fstream>
using namespace std;

string koduj( string tekst, string klucz )
{
    string szyfr = "";
    int ascii, numer, pom, pom2 = tekst.size();
    for( int j = 0; j < pom2; j++ )
    {
        ascii = tekst[ j ];
        numer = klucz[ j ] - 64;
        if( ascii + numer <= 90 )
        {
            pom = ascii + numer;
        }
        else
        {
            pom =( ascii + numer ) - 26;
        }
        szyfr += char( pom );
    }
    return szyfr;
}
int main()
{
    int pom, pom2;
    string slowo, slowo2, klucz2;
    fstream plik, plik2, plik3;
    plik.open( "C://Users/Michał/Desktop/tj.txt", ios::in );
    plik2.open( "C://Users/Michał/Desktop/klucze1.txt", ios::in );
    plik3.open( "C://wynik4a.txt", ios::out | ios::trunc );
    if( !plik.good() )
    { cout << "blad otwarcia pliku";
        return 0; }
    if( !plik2.good() )
    { cout << "blad otwarcia pliku";
        return 0; }
    while( !plik.eof() )
    {
        plik >> slowo;
        plik2 >> slowo2;
        if( slowo.size() <= slowo2.size() )
        {
            plik3 << koduj( slowo, slowo2 ) << endl;
        }
        else
        {
            klucz2 = "";
            pom2 = slowo.size();
            for( int i = 0; i < pom2; i++ )
            {
                pom = i % slowo2.size();
                klucz2 += slowo2[ pom ];
            }
            plik3 << koduj( slowo, klucz2 ) << endl;
        }
    }
    plik.close();
    plik2.close();
    plik3.close();
    return 0;
}
P-94653
Admixior
» 2013-10-27 16:49:27
Mogę zwrócić na dwie rzeczy uwagę.
1. ścieżki w windowsie pisze się od odwrotnych ukośników i pisze się je (w c++) podwójnie.
2. eof jest zgłaszany dopiero po tym jak nie ma już niczego do odczytania i ty spróbujesz jeszcze coś odczytać!
P-94678
pekfos
» 2013-10-27 17:17:59
1. ścieżki w windowsie pisze się od odwrotnych ukośników i pisze się je (w c++) podwójnie.
Można także od 'zwykłych ukośników'.
P-94680
Don_Corleone
Temat założony przez niniejszego użytkownika
» 2013-10-27 21:26:35
Admixior mógł byś rozwinąć swoją wypowiedź co do punktu 2?
P-94695
Admixior
» 2013-10-28 09:28:25
Przedostatnie okrążenie pętli:
pobierasz dane z obu plików (dostajesz poprawne słowa) - w plikach już nic nie ma, ale eof'a dalej nie ma
wykonujesz dalej polecenia - kodowanie
sprawdzasz czy jest eof (w while(!plik.eof() ) - nie ma, pomimo że w plikach nic nie ma

Ostatnie okrążenie pętli:
pobierasz dane - oba stringi są puste i dopiero teraz ustawiana jest flaga eof
pracujesz na pustych stringach

więc eof musisz sprawdzić po wczytaniu danych.


//to raczej nie spowoduje usunięcia błędu, bo wszędzie dzielenie przez zero masz ograniczone pętlami które się nigdy nie wykonają :p ale warto o takim czymś wiedzieć.

//możesz po każdej pętli zrobić plik3.flush(); wtedy zobaczysz ile linijek zostało przetworzone i przy której się zacięło.

//oczywiście zakładam że oba pliki mają tyle samo linijek z jakimikolwiek danymi w każdej.
P-94704
Don_Corleone
Temat założony przez niniejszego użytkownika
» 2013-10-28 16:55:52
Okej już znalazłem błąd, kod był dobry ale pliki były w złym miejscu zapisane.
Admixior czyli jak powinienem odczytywać te pliki żeby nie wczytywało ostatniego elementu 2 razy?
P-94717
pekfos
» 2013-10-28 21:25:40
Sprawdzać eof() zaraz po wczytaniu.
P-94746
« 1 »
  Strona 1 z 1