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

Problem z nadpisaniem pliku

Ostatnio zmodyfikowano 2017-01-15 14:01
Autor Wiadomość
Calavera
Temat założony przez niniejszego użytkownika
Problem z nadpisaniem pliku
» 2017-01-15 01:28:59
Mam problem z programem mającym zamienić pierwszą z ostatnią literą w każdym wyrazie w pliku, przy czym nie mogę wczytać całego pliku oraz używać dodatkowych plików.
Sprawdziłem działanie programu dla standardowego wyjścia cout i działa jak należy, lecz kiedy biorę się za nadpisanie pliku to plik wynikowy jest kompletnie pomieszany i mimo różnych prób nie mam pojęcia co jest nie tak.

C/C++
using namespace std;

fstream plik;

int main()
{
    plik.open( "tekst.txt", ios::in | ios::out );
   
    plik.seekp( 0, ios::beg );
    plik.seekg( 0, ios::beg );
    vector < char > v;
   
    string wiersz1;
    while( getline( plik, wiersz1 ) )
    {
       
        char seps[] = " ";
        char * token;
        string wymieszane, wymieszane2, wypis;
        wymieszane2 = "";
        token = strtok( & wiersz1[ 0 ], seps );
        while( token != NULL )
        {
            wymieszane = "";
            for( int i = 0; i < strlen( token ); i++ )
            {
               
                v.push_back( token[ i ] );
               
            }
           
            wymieszane += v[ v.size() - 1 ];
            for( int j = 1; j < v.size() - 1; j++ )
            {
                wymieszane += v[ j ];
            }
            wymieszane += v[ 0 ];
           
            wymieszane2 += wymieszane;
            wymieszane2 += " ";
           
            v.clear();
            token = strtok( NULL, seps );
        }
        wypis = wymieszane2.substr( 0, wymieszane2.size() - 2 );
        plik << wypis;
       
    }
}
P-156452
j23
» 2017-01-15 10:59:34
std::string i strtok? Nie wystarczą string::find_first_not_of i string::find_first_of, albo dwie pętle while i isspace?


Błędnie założyłeś, że wskaźniki zapisu i odczytu pliku są niezależne. One są ze sobą związane, i dlatego bez żonglerki wskaźnikami się nie obejdzie. Jakoś tak może być:
C/C++
...
size_t gp1 = fs.tellg();

while( std::getline( fs, s ) )
{
    size_t gp2 = fs.tellg();
    fs.seekp( gp1 );
   
    fs << s << '\n';
   
    fs.seekp( gp2 );
    gp1 = gp2;
}
Nie zdziwiłbym się, gdybyś musiał otworzyć strumień w trybie binarnym.
P-156453
mokrowski
» 2017-01-15 14:01:36
#include <fstream>
#include <iostream>

using namespace std;

int main() {
    fstream file("slowa.txt", ios::in | ios::out | ios::binary);

    string word;
    while(file >> word) {
        size_t word_size = word.size();
        if(1 < word_size) {
            swap(word.front(), word.back());
            file.seekp(file.tellg(), ios::beg).seekp(-word_size, ios::cur);
            file << word;
            file.seekp(word_size, ios::cur);
        }
    }
}
P-156455
« 1 »
  Strona 1 z 1