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

Problem z zapisem do pliku

Ostatnio zmodyfikowano 2014-01-12 11:42
Autor Wiadomość
aruenne
Temat założony przez niniejszego użytkownika
Problem z zapisem do pliku
» 2014-01-12 00:24:37
Witam!
Mam program, który ma wyszukiwać w pliku tekstowym ciąg znaków podany na wejście i zamienić na inny ciąg (też podany na wejście). Problem polega na tym, że zamienia, owszem, ale tylko w I linijce pliku tekstowego. A w następnych(gdzie ten ciąg występuje) już nie. Proszę o pomoc :)
C/C++
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<cstring>
#include<stdio.h>

using namespace std;

void zerowanie( char[], char[] );

int main()
{
    char a[ 200 ];
    char b[ 200 ];
    string linia;
    char tablica[ 200 ];
    fstream plik( "test.txt", ios::in | ios::out ); //otworzenie pliku w trybie do odczytu i zapisu
    if( !plik ) //jeżeli nie udało się otworzyć  pliku
    {
        cout << "Plik nie zostal otwarty" << endl;
        return 1;
    }
    zerowanie( a, b );
    noskipws( plik );
    cout << "Podaj ciag znakow" << endl;
    cin >> a;
    cout << endl << "Na co zamienic?" << endl;
    cin >> b;
    plik.seekp( 0 );
    int licznik = 0;
   
    //dlugosc wprowadzanego a
    int licznika = 0;
    for( int i = 0; i < 200; i++ )
    {
        if( a[ i ] != ' ' )
             licznika = licznika + 1;
       
    }
   
    //dlugosc wprowadzanego b
    int licznikb = 0;
    for( int i = 0; i < 200; i++ )
    {
        if( b[ i ] != ' ' )
             licznikb = licznikb + 1;
       
    }
   
   
    if( licznika > licznikb )
         licznik = licznika;
    else
         licznik = licznikb;
   
    while( plik )
    {
        plik.getline( tablica, 200 );
        linia = tablica;
       
        long pozycja = linia.find( a );
        plik.seekp( pozycja );
        plik.write( reinterpret_cast < char *>( & b ), licznik );
    }
    plik.close();
    return 0;
}

void zerowanie( char a[], char b[] )
{
    for( int i = 0; i < 200; i++ )
         a[ i ] = ' ';
   
    for( int i = 0; i < 200; i++ )
         b[ i ] = ' ';
   
}
P-101898
mav_ax_13h
» 2014-01-12 10:10:35
Problem, jak się zapewne domyślasz dotyczy linijek:
    while( plik )
    {
        plik.getline( tablica, 200 );
        linia = tablica;
       
        long pozycja = linia.find( a );
        plik.seekp( pozycja );
        plik.write( reinterpret_cast < char *>( & b ), licznik );
    }

long pozycja wskazuje gdzie znajduje się szukany tekst w stringu, a nie w pliku, natomiast seekp ustawia pozycje w pliku względem początku pliku.
Dodatkowo, w każdej linijce sprawdzasz tylko pierwszy pasujący wyszukiwany tekst, a następnie odczytujesz kolejną linie z pliku, co sprawi, że w przypadku tekstu:
   coś tam coś tam szukany_tekst coś tam coś tam szukany_tekst coś tam...\n
zostanie "zastąpiony" tylko pierwszy szukany tekst.
Inna sprawa, że takie zapisywanie na ślepo sprawi, że będziesz miał w pliku same śmieci, nie licząc przypadku kiedy tekst wyszukiwany i ten którym chcesz zastąpić będą takiej samej długości:
szukany = ala
zastap = alicja
i z tekstu "ala ma kota" robisz "alicja kota"
lub w drugą strone:
szukany = alicja
zastap = ala
i z tekstu "alicja ma kota" robisz "alacja ma kota"

Jak dla mnie wygodniej było by to zrobić tak:
1. odczytaj cały plik do stringa
2. wyszukaj pierwszy szukany wyraz
3a. jesli długosć "szukany" i "zastap" takie same wpisz na tą pozycje wyraz "zastap"
3b. jeśli nie, tworz nowy string na zasadzie:
  stringOdczytganyZpliku = stringOdczytganyZpliku<0, pozycja "wyszukany"> + zastap + stringOdczytganyZpliku<pozycja "wyszukany" + dlugosc wyszukany, do konca stringOdczytganyZpliku>;
  gdzie <,> oznacza wytnij_ze_stringa<od, do>
4. szukaj nastepnego pasujacego wyrazu i skocz do poz 3
5. zapisz string do pliku
P-101904
aruenne
Temat założony przez niniejszego użytkownika
» 2014-01-12 10:59:55
Dziękuję za odpowiedź. :)
Tak, tylko... nie umiem sobie poradzić z tym problemem. Dlatego też napisałam.
Niestety nie mogę wczytać całego pliku do stringa. Zadanie polega na tym, że w założeniu plik jest nieskończenie duży i mam wczytywać jakimiś partiami.
P-101907
Monika90
» 2014-01-12 11:42:41
Możesz wczytywać z jednego pliku, a zapisywać do drugiego - tymczasowego. Na koniec usunąć plik z którego wczytywałaś dane i zmienić nazwę pliku tymczasowego na taką jaką miał ten plik z którego wczytywałaś.
P-101914
« 1 »
  Strona 1 z 1