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

zapisywanie do pliku

Ostatnio zmodyfikowano 2011-03-03 15:37
Autor Wiadomość
neke
Temat założony przez niniejszego użytkownika
zapisywanie do pliku
» 2011-03-01 22:31:09
Witam,

W ferworze walki z kursem poległem tym razem na wpisywaniu tekstu do pliku. Próbując zastosować informacje z kursu za cholerę nie mogę uzyskać oczekiwanego efektu.

Napisałem program, który wczytuje trzema wspomnianymi sposobami informacje do pliku a następnie wyświetla je. Nie działa on jednak tak jak powinien. Będę wdzięczny za poprawienie kodu. Uwagi w stylu "mozna to przecież zrobić łatwiej za pomocą szybkiej transormaty Fouriera przy uwzględnieniu teorii względności", są oczywiście bardzo pouczające. Nie dla mnie jednak ze względu na moją stosunkową mizerną wiedzę o języku. Dlatego będę wdzięczny za wskazanie błędów w obecnym kodzie :)

C/C++
#include <fstream>
#include <string>
#include <conio.h>
#include <iostream>

using namespace std;

int main()
{
    fstream plik;
   
    //zapisywanie danych za pomocą strumienia
    plik.open( "D:\\aa.txt", ios::in | ios::out ); //chcę zmodyfikowac plik o nazwie aa
    string tekst;
    cin.getline( tekst, 1024 ); //wprowadzam teks z klawiatury
    plik << tekst; /*zapisuje wprowadzony tekst w pliku zgodnie z kursem tzn.
        nazwa_zmiennej_plikowej << zmienna_ktora_ma_zostac_zapisana_do_pliku;  */
    plik.close();
   
    // zapisywanie danych blokami
    plik( "D:\\bb.txt", ios::in | ios::out ); //chcę utworzyć plik o nazwie bb
    char bufor[ 30 ];
    char * wskaznik = & bufor;
    cin.getline( bufor, 30 );
    plik.write( * wskaznik, bufor.length( 1024 ) ); //zapisuje wprowadzony tekst w pliku zgodnie z kursem
    plik.close();
   
    //wczytywanie zawartosci aa
    plik.open( "D:\aa.txt", ios::in | ios::out );
    if( plik.good() == true )
    {
        char dane[ 1024 ];
        plik.read( dane, 1024 );
        // getline (plik, dane);
        cout << dane << endl;
        plik.close();
    }
    else
         cout << "Nie udalo sie otworzyc pliku aa" << endl;
   
    //wczytywanie zawartosci bb
    plik.open( "D:\bb.txt", ios::in | ios::out );
    if( plik.good() == true )
    {
        string data;
        getline( plik, data );
        cout << data << endl << endl;
        plik.close();
    }
    else
         cout << "Nie udalo sie otworzyc pliku bb";
   
   
    getch();
    return( 0 );
}
P-28715
malan
» 2011-03-01 23:06:08
Po pobieżnej analizie kodu mówię:
  • nie otwieraj pliku do zapisu i do odczytu jednocześnie (
    plik.open( "D:\\aa.txt", ios::in | ios::out );
    ),
  • zapoznaj się z metodą ios::clear jeżeli chcesz używać tej samej zmiennej plikowej więcej niż jeden raz,
  • C/C++
    char bufor[ 30 ];
    char * wskaznik = & bufor;
    cin.getline( bufor, 30 );
    Nie prościej tak:
    C/C++
    char buffer[ 30 ];
    std::cin.getline( buffer, 30 );
    ?
  • zapoznaj się z std::ifstream i std::ofstream.
P-28720
neke
Temat założony przez niniejszego użytkownika
» 2011-03-02 11:14:53
1. Ok
2. Ok
3. wskaznik jest uzywany w kodzie ponizej dlatego powinien tam moim zdaniem zostac.
4. Niestety jestem na takim etapie nauki ze samo lakoniczne stwierdzenie jak wyglada np. fsteam.open mi nie wystarcza, dlaego prosiłem o poprawienie mojego kodu. W ten sposób najlatwiej sie nauczyc i zrozumiec zagadnienie.

Będę wdzięczny za pomoc.
P-28730
neke
Temat założony przez niniejszego użytkownika
» 2011-03-02 19:09:39
Czy potrafi kto fskazć błedy? Dla fprawnej osoby to to chyba nie problem?
P-28761
malan
» 2011-03-02 20:31:06
Gdybyś poprawił to, co Ci wypisałem to problemów by nie było. A jakby były to zapewne na podstawie treści błędu kompilatora sam byś doszedł co jest nie tak...
P-28769
neke
Temat założony przez niniejszego użytkownika
» 2011-03-03 15:37:27
Dobra. Trochę posiedziałem nad tym kodem i dane się wczytują.
Pozostały tylko małe problemy z którymi sobie nie radzę:
1. program nie tworzy nowych plików (bb.txt, cc.txt)?
2. w części zapisywanie blokami wywala błąd gdy chcę zastąpić "&bufor" równoznacznym "wskaznik"?
3. jaka jest praktyczna różnica pomiędzy wczytywaniem danych do pliku poprzez string i char [1000]?
4. jaka jest praktyczna różnica pomiędzy wczytywaniem danych do pliku poprzez strumień i blok (oprócz innego zapisu)?
5. Czy można wczytać do pliku enter (po to by tekst zapisywał się w nowej linii)?
6. Dlaczego przy wykorzystaniu char dane wpisuje się do pliku jak niżej
C/C++
char tekst[ 50 ];
cin.getline( tekst, 1024 );

natomiast przy wykorzystaniu stringa trzeba użyć innej metody?
C/C++
string B;
getline( cin, B );

C/C++
#include <fstream>
#include <string>
#include <conio.h>
#include <iostream>

using namespace std;

int main()
{
    fstream plik;
   
   
    //zapisywanie danych za pomocą strumienia wersja A
    plik.open( "D:\\aa.txt", ios::in | ios::out );
    char tekst[ 50 ];
    cin.getline( tekst, 1024 );
    plik << tekst;
    plik.close();
   
    //zapisywanie danych za pomocą strumienia wersja B
    plik.open( "D:\\bb.txt", ios::in | ios::out ); //nie tworzy nowego pliku!
    string B;
    getline( cin, B );
    plik << B;
    plik.close();
   
    //zapisywanie danych blokami
    plik.open( "D:\\cc.txt", ios::in | ios::out ); //nie tworzy nowego pliku!
    string bufor;
    getline( cin, bufor );
    string * wskaznik = & bufor;
    plik.write( & bufor[ 0 ], bufor.length() ); //zapisuje wprowadzony tekst w pliku zgodnie z kursem
    plik.close();
   
   
    //wczytywanie zawartosci aa
   
    plik.open( "D:\\aa.txt", ios::in | ios::out );
    if( plik.good() == true )
    {
        char dane[ 1024 ];
        plik.read( dane, 1024 );
        cout << dane << endl;
        plik.close();
    }
    else
         cout << "Nie udalo sie otworzyc pliku aa" << endl;
   
    //wczytywanie zawartosci bb
   
    plik.open( "D:\\bb.txt", ios::in | ios::out );
    if( plik.good() == true )
    {
        char dane[ 1024 ];
        plik.read( dane, 1024 );
        cout << dane << endl;
        plik.close();
    }
    else
         cout << "Nie udalo sie otworzyc pliku bb" << endl;
   
    //wczytywanie zawartosci cc
   
    plik.open( "D:\\cc.txt", ios::in | ios::out );
    if( plik.good() == true )
    {
        string napis;
        getline( plik, napis );
        cout << napis << endl << endl;
        plik.close();
    }
    else
         cout << "Nie udalo sie otworzyc pliku cc" << endl;
   
    getch();
    return( 0 );
}
P-28798
« 1 »
  Strona 1 z 1