Zapisywanie do konkretnej lini w pliku tekstowym - fstream

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?

0

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

0

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

używając

fout.seekp(24);

dostaje

sdfsdf sdf sdf

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.

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?"

0

a jak ustawie się w 6 wierszu?

0

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

0

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

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".

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