Zapisywanie do konkretnej lini w pliku tekstowym - fstream

Odpowiedz Nowy wątek
2015-02-04 18:16
Pyta
0
void WriteLine(const std::string &name, std::string wline, int line)
{
    std::fstream fin(name.c_str());
    if(fin.is_open() == 1)
    {
        for(int i = 0; i <= line; i++)
        {
            if(i == line)fout << wline << std::endl;
        }
    }
    fin.close();
}

//struktura pliku
//qwerty
//acgd
//hfdghgf

Chciałbym po wywołaniu funkcji

WriteLine("C:\t.txt", "ZZZ", 2);

otrzymać

//struktura pliku
//qwerty
//ZZZ
//hfdghgf

Jednak nie wiem jak poruszać się po pliku.
Da ktoś jakieś wskazówki?

Pozostało 580 znaków

2015-02-04 18:23
0

Klik.
Klik.


GG: 10101100010110000100011101 (BIN)
"Nie wszystko napisane w internecie jest prawdą" - Józef Piłsudski.

Pozostało 580 znaków

2015-02-04 18:29
Pyta
0

Jak mam przesunąć tak by zapisać np: wiersz niżej?

W każdym odnośniku informacja znajduje się na dole strony. - Trebuh 2015-02-04 18:33

Pozostało 580 znaków

2015-02-04 18:51
Pyta
0

Już widziałem te strony i naprawdę nie wiem :/

używając

fout.seekp(24);

dostaje

sdfsdf sdf sdf

Pozostało 580 znaków

2015-02-04 18:56
0

x - linia do której chcemy zapisać,

Jedziesz na koniec linii x-1, na początku string'a do zapisania dodajesz znak nowej linii. Zapisujesz.


GG: 10101100010110000100011101 (BIN)
"Nie wszystko napisane w internecie jest prawdą" - Józef Piłsudski.

Pozostało 580 znaków

2015-02-04 19:03
Pyta
0

A jeśli chciałbym przejść do siódmej linijki?
To miało by to tak wyglądać?
"/n/n/n/n/n/n/ntekst?"

Nie, x - 1 to kursor ustawiony na poprzedniej linijce na końcu. x - to argument line. - Trebuh 2015-02-04 19:08

Pozostało 580 znaków

2015-02-04 19:17
Pyta
0

a jak ustawie się w 6 wierszu?

Naprowadziłem Ciebie więc teraz to napisz. - Trebuh 2015-02-04 19:26

Pozostało 580 znaków

2015-02-04 19:59
Pyta
0

Wiem tyle samo co przed założeniem tematu ale spróbuje coś pomyśleć.

Pozostało 580 znaków

2015-02-04 20:14
0

Podpowiem jeszcze trochę. Pętla + zbieranie informacji ile znaków jest do ostatniego znaku końca linii + ustalenie pozycji kursora = rozwiązanie.


GG: 10101100010110000100011101 (BIN)
"Nie wszystko napisane w internecie jest prawdą" - Józef Piłsudski.

Pozostało 580 znaków

2015-02-07 18:38
pyta
0

OK myśle że znalazłem rozwiązanie.
Napisałem sobie taką klase.


#include <string>
#include <vector>
#include <fstream>

class CFile
{
public:
    CFile();
    ~CFile();

    bool loadFile(std::string PathToFile);
    void saveFile();///konczy prace z plikiem

    std::string getLine(unsigned int numberLine);///otrzymujemy linie ktoranas interesuje
    void changeLine(std::string str,unsigned int numberLine);///zamienia linie podana w drugim argumencie na to co jest w strinu
private:

    std::fstream * HandleToFile;
    std::vector <std::string> linesOfTheFile;
    std::string m_PathToFile;
    bool wasChanged;

protected:

};
CFile::CFile()
{
    HandleToFile = new std::fstream;
    wasChanged = 0;
}
CFile::~CFile()
{
    delete HandleToFile;
}
bool CFile::loadFile(std::string PathToFile)
{
    m_PathToFile = PathToFile;
    HandleToFile->open( m_PathToFile.c_str(), std::ios::in | std::ios::out);///otwarcie z mozliwoscia odczytu i zapisu

    if(HandleToFile->good() == true)/// uzyskano dostep
    {
        while( HandleToFile->eof() == false ) /// sa jeszcze dane do odczytu
        {
            std::string tempstr;///tymczasowy string
            getline( *HandleToFile, tempstr );///wczytujemy caly wiersz do stringa

            linesOfTheFile.push_back(tempstr);///dokldamy stringa na koniec
        }
     HandleToFile->close();
    return 0;///sukces
    }
 return 1;///error
}
void CFile::saveFile()
{
    HandleToFile->open( m_PathToFile.c_str(), std::ios::trunc | std::ios::out);

    if(HandleToFile->good() == 1 && wasChanged == 1)
    {

      for( unsigned int i = 0; i < linesOfTheFile.size(); i++ )
      {
        ///tablica jest za kazdym razem wieksza przez to ze na koncu ostatniej lini dodawany jest zank konca lini
        /// rozwiazaniem jest sprawic by na koncu nie byl dodawany znak
         if( ( i+1 < linesOfTheFile.size() ) == false)///czy to ostatnia linia do zapisu
         {//tak
             *HandleToFile << linesOfTheFile[ i ];
         }
         else
        {//nie
          *HandleToFile << linesOfTheFile[ i ] << std::endl;
        }
      }
      HandleToFile->flush();
    }
    HandleToFile->close();
}
std::string CFile::getLine(unsigned int numberLine)
{
   return linesOfTheFile[numberLine];
}
void CFile::changeLine(std::string str,unsigned int numberLine)
{
    if(linesOfTheFile.size() < numberLine)
    {
        unsigned int j = numberLine+1-linesOfTheFile.size();
        for(unsigned int i = 0;i < j;i++)
        {
            linesOfTheFile.push_back("");///wstawianie pustej lini
        }
    }
    linesOfTheFile[numberLine] = str;
    wasChanged = 1;

}

Czy mógłby ktoś ocenić czy ten kod jest "znośny".

Jest w miare ok moim zdaniem. Metody które nie zmieniają stanu obiektu powinny być const. Argumenty tak samo. - Proxima 2015-02-07 19:04
cały ten kod nadaje się tylko i wyłacznie do kosza... - spartanPAGE 2015-02-07 19:08
1. Kod głupi u podstaw. 2. Łatwo o wyciek. 3. Niepotrzebne zagnieżdżenia. 4. Te tłuste metody można zapisać w 2/3 linijkach. - spartanPAGE 2015-02-07 19:17
@spartanPAGE zapomniałeś o wczytywaniu całego pliku do pamięci ;p - satirev 2015-02-07 19:19
@satriev podpina sie pod nr 1 ;p - spartanPAGE 2015-02-07 20:25

Pozostało 580 znaków

2015-02-07 21:59
pyta
0

@spartanPAGE
@Satirev

Łatwo o wyciek pamięci - czy możecie mnie uświadomić gdzie ?
Ta wiedza może mi się przydać w przyszłości.

Kod głupi u podstaw - no cóż
"Jeśli coś jest głupie, ale działa, to nie jest głupie."
http://pl.wikiquote.org/wiki/Prawa_Murphy%27ego

Niepotrzebne zagnieżdżenia - w sensie ? za dużo if'ów ? czy coś serio pytam.

Tłuste metody można zapisać w 2/3 linijkach - proszę o przykład.


PS Jak by ktoś był tak dobry to może napisze kod lepszy od mojego i pokaże jak to powinno wyglądać np wczytywanie pliku - taka prośba.

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0