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

[Kursy XVI i XVII]Kilka pytań - Nadpisywanie pliku tekstowego...

Ostatnio zmodyfikowano 2009-08-07 00:41
Autor Wiadomość
Rudy
Temat założony przez niniejszego użytkownika
[Kursy XVI i XVII]Kilka pytań - Nadpisywanie pliku tekstowego...
» 2009-08-04 15:00:25
Witam ponownie.
Mam taki kod:
C/C++
#include <iostream>
#include <fstream>
#include <conio.h>
#include <string>
#include "mine\adv_data.cpp"

using namespace std;
using namespace adv_data;

int main()
{
    unsigned char litera;
    string tekst;
    fstream plik;
    plik.open( "Test.txt", ios::in | ios::out );
    if( plik.good() )
    {
        while( !plik.eof() )
        {
            getline( plik, tekst );
            cout << tekst << endl;
        }
        litera = getch();
        while( litera != 27 )
        {
            cout << litera;
            plik << litera;
            litera = getch();
        }
        plik.close();
        cout << endl << endl << "-== Zapisano ==-" << endl;
    }
    else
    {
        cout << "Nie wczytano pliku!";
        cout << "Kliknij dowolny przycisk, aby zako" << ALT_N << "czy" << ALT_C << "...";
    }
    getch();
    return( 0 );
}
Plik Test.txt istnieje i znajduje się tam, gdzie plik źródłowy. Odczytywanie pliku przebiega zgodnie z planem, błąd pojawia się dopiero przy tej linii:
plik << litera;
Pytanie: dlaczego program nie wpisuje litery, która znajduje się w zmiennej? Linijka przed tą działa poprawnie.
P-9015
malan
» 2009-08-04 15:13:15
C/C++
plik.open( "Test.txt", ios::in | ios::out );
 Spróbuj najpierw otworzyć plik do odczytu, a potem do zapisu. Czyli:
-otwórz plik do odczytu;
-odczytaj dane;
-zamknij plik;
-otwórz plik do zapisu;
-zapisz dane;
-zamknij plik;
P-9017
Rudy
Temat założony przez niniejszego użytkownika
» 2009-08-04 15:16:16
Po zamknięciu programu i otwarciu pliku testowego był on czysty (wcześniej coś w nim było zapisane, ale za pomocą notatnika).
P-9018
malan
» 2009-08-04 15:19:00
Tak powinno być :). Jeśli chcesz dopisywać dane musisz otworzyć plik do zapisu + zapisywać na końcu pliku (ios::app).
P-9019
Rudy
Temat założony przez niniejszego użytkownika
» 2009-08-04 15:29:18
Zmieniłem, sytuacja ta sama co na początku. Program odczytuje to, co jest w pliku, ale nie potrafi dopisać nowych danych.

Sprawdzałem z ios::app, oraz z ios::out|ios::app

Dla pewności pokażę, jak teraz wygląda kod:

C/C++
...
plik.open( "Test.txt", ios::in );
if( plik.good() )
{
    while( !plik.eof() )
    {
        getline( plik, tekst );
        cout << tekst << endl;
    }
    plik.close();
    plik.open( "Test.txt", ios::out | ios::app );
    litera = getch();
    while( litera != 27 )
    {
        cout << litera;
        plik << litera;
        litera = getch();
    }
    plik.close();
    cout << endl << endl << "-== Zapisano ==-" << endl;
}
...
P-9020
malan
» 2009-08-04 15:32:53
Zamień:
C/C++
plik.close();
plik.open( "Test.txt", ios::out | ios::app );
 ...na:
C/C++
plik.close();
plik.clear();
plik.open( "Test.txt", ios::out | ios::app );
P-9021
Rudy
Temat założony przez niniejszego użytkownika
» 2009-08-04 15:38:28
Działa :)

Jest jeszcze jeden problem. Otóż, jeżeli wcisnę enter, na konsoli kursor przeskakuje na początek obecnego wiersza, a w pliku nic się nie dzieje.
1. Jak zrobić, by klikając enter robiło się to co powinno (czyli skok do nowej liniki)?
2. Czy może być więcej tego typu przycisków, jak na przykład Backspace, Delete?
P-9023
malan
» 2009-08-04 15:47:11
1. Tworzysz warunek, w którym sprawdzasz wartość litera.
1.2. Jeśli wartość = 13 (13- kod klawisza ENTER) to litera = '\\n' (gdzie '\\n' oznacza znak nowej lini).
Coś takiego:
C/C++
if( litera == 13 )
     litera = '\n';

2. Tak. Tabela kodów ASCII.
P-9025
« 1 » 2 3
  Strona 1 z 3 Następna strona