Scriere in fisier la o anumita pozitie

Intrebari despre programarea cu VC++ incluzand mediul de dezvoltare, instalare, setari, debugger, compilator, linker si documentatie.
Post Reply
User avatar
Popa Alin
Membru
Membru
Posts: 52
Joined: 30 May 2008, 11:00
Judet: Timiş
Location: Timisoara

Scriere in fisier la o anumita pozitie

Post by Popa Alin » 03 Sep 2008, 17:31

Ciao,

Exista o functie MFC cu ajutorul careia pot sa scriu intr-un fisier *.txt informatie la o anumita pozitie? Adica sa introduc "linia si numarul pozitiei din linia respectiva" si de acolo sa inceapa sa scrie informatie. Deci mi se pare ca functia Seek pica :(
Sau cum pot sa numar liniile in VC++, adica sa se pozitioneze cursorul la linia "x". I mean, care este terminatorul pentru linie noua, ca "\n" nu mere :((


Mersic fain.


Great minds disscuss ideas, average minds disscuss events, small minds disscuss people.

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Scriere in fisier la o anumita pozitie

Post by Marius Bancila » 03 Sep 2008, 18:28

N exista ceea ce vrei tu. Daca vrei sa ajungi la o anumita linie trebuie sa numeri terminatoarele de linie (\n sau \r\n).
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Popa Alin
Membru
Membru
Posts: 52
Joined: 30 May 2008, 11:00
Judet: Timiş
Location: Timisoara

Re: Scriere in fisier la o anumita pozitie

Post by Popa Alin » 03 Sep 2008, 18:38

Marius Bancila wrote:N exista ceea ce vrei tu. Daca vrei sa ajungi la o anumita linie trebuie sa numeri terminatoarele de linie (\n sau \r\n).
De acord cu tine, dar nu pot sa numar terminatoarele de linie "\n" sau "\r\n" pentru ca mie imi vede terminatorul asa " □ " :(( si daca fac comparatia cu "□" evident ca nu o poate face pentru ca nu este un caracter cunoscut de VC++, am pus si codul ASCII al "□" dar degeaba :(


Mersi fain
Great minds disscuss ideas, average minds disscuss events, small minds disscuss people.

User avatar
Marius Bancila
Fondator
Fondator
Posts: 2344
Joined: 11 Jul 2007, 11:45
Judet: Timiş
Location: Timisoara
Contact:

Re: Scriere in fisier la o anumita pozitie

Post by Marius Bancila » 03 Sep 2008, 23:35

Cum adica? Compararea o faci cu '\r' sau '\r' urmat de '\n'. Poti sa ne arati codul tau?

Poti face ceva de genul.

Code: Select all

int linii = 1;
char CR = '\r';
char LF = '\n';

// citesti sa zicem cate 128 de bytes odata
for(int i = 0; i < read; ++i)
  if(buffer[i] = LF) linii++; // asta e \n
  else if(buffer[i] == CR) // asta e \r
  {
    if(buffer[i+1] == LF) ++i; // mai e si un \n dupa \r
    linii++;
  }
Desigur la un momentdat trebe sa te opresti, si probabil sa te intorci inapoi cu un anumit numar de bytes (read - i). Dar cam asta ar fi idea.
Marius Bancila
Fondator Codexpert, Microsoft MVP VC++
Site personal | Blog

User avatar
Popa Alin
Membru
Membru
Posts: 52
Joined: 30 May 2008, 11:00
Judet: Timiş
Location: Timisoara

Re: Scriere in fisier la o anumita pozitie

Post by Popa Alin » 04 Sep 2008, 14:57

Am rezolvat problema, folosind numai numarul pozitiei de la care incepe scrierea.

Insa pentru mine ramane un mister determinarea numarului de linii din fisier. Pare interesant codul scris de tine. O sa mai sap si eu sa vad cum sta treaba.

Mersi fain.
Great minds disscuss ideas, average minds disscuss events, small minds disscuss people.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Scriere in fisier la o anumita pozitie

Post by Ovidiu Cucu » 05 Sep 2008, 17:24

Iaca aici un exemplu de functie de numarare si unul de inserare "linii" cu MFC.

Code: Select all

int GetLinesCount(LPCTSTR pszFileName)
{
   int lines = 0;
   CStdioFile file(pszFileName, CFile::modeRead);
   CString strLine;
   while(file.ReadString(strLine))
   {
      lines++;
   }
   return lines;
}

Code: Select all

void InsertLine(UINT nLineIndex, LPCTSTR pszFileName, LPCTSTR pszLine)
{
   CStdioFile fileSrc(pszFileName, CFile::modeRead);
   CString strTmpFile = pszFileName;
   strTmpFile += _T(".tmp");
   CStdioFile fileTmp(strTmpFile, 
      CFile::modeWrite|CFile::modeCreate|CFile::typeBinary);
   UINT nReadIndex = 0;
   CString strReadLine;
   while(fileSrc.ReadString(strReadLine))
   {
      if(nReadIndex == nLineIndex)
      {
         CString strLine = pszLine;
         strLine += _T("\r\n");
         fileTmp.WriteString(strLine);
      }
      strReadLine += _T("\r\n");
      fileTmp.WriteString(strReadLine);
      nReadIndex++;
   }
   fileSrc.Close();
   fileTmp.Close();
   CFile::Remove(pszFileName);
   CFile::Rename(strTmpFile, pszFileName);
}
BTW. Un fisier nu contine linii. Doar prin conventie, anumite caractere cum ar fi '\n' sau secvente de caractere "\r\n", sunt folosite ca delimitatori in asa fel incat un editor de text sau alt fel de aplicatie sa poata face "impartirea pe linii" placuta vederii ochiului omenesc...

User avatar
Popa Alin
Membru
Membru
Posts: 52
Joined: 30 May 2008, 11:00
Judet: Timiş
Location: Timisoara

Re: Scriere in fisier la o anumita pozitie

Post by Popa Alin » 10 Sep 2008, 17:50

Ovidiu Cucu wrote: BTW. Un fisier nu contine linii. Doar prin conventie, anumite caractere cum ar fi '\n' sau secvente de caractere "\r\n", sunt folosite ca delimitatori in asa fel incat un editor de text sau alt fel de aplicatie sa poata face "impartirea pe linii" placuta vederii ochiului omenesc...
Da, stiam asta Ovidiu, insa e bine ca ai spus-o pentru ca poate o sa fie folositoae altora care citesc acest topic.

Ceea ce nu inteleg eu este: "Care e diferenta dintre CFile si CStdioFile". Eu foloseam pana acum CFile dar am vazut in multe coduri CStdioFile si nu prea stiu ce avantaje aduce in plus fata de CFile si mergand pe deviza "Mai bine sa fii prost 5 minute cat pui o intrebare decat sa ramaii prost toata viata" am indraznit si am pus aceasta intrebare.

Mersi fain.
Great minds disscuss ideas, average minds disscuss events, small minds disscuss people.

User avatar
Ovidiu Cucu
Fondator
Fondator
Posts: 3778
Joined: 11 Jul 2007, 16:10
Judet: Iaşi
Location: Iasi
Contact:

Re: Scriere in fisier la o anumita pozitie

Post by Ovidiu Cucu » 14 Sep 2008, 22:46

Pai... hai sa vedem ce spune MSDN-ul!
MSDN
A CStdioFile object represents a C run-time stream file as opened by the run-time function fopen. Stream files are buffered and can be opened in either text mode (the default) or binary mode.

Text mode provides special processing for carriage return-linefeed pairs. When you write a newline character (0x0A) to a text-mode CStdioFile object, the byte pair (0x0D, 0x0A) is sent to the file. When you read, the byte pair (0x0A, 0x0D) is translated to a single 0x0A byte.
[...]
Well, mai pe scurt, mai pe romaneste si mai placut urechilor, CStdioFile fiind derivat din CFile stie (aproape) tot ce stie sa faca si clasa de baza dar adauga doua metode CStdioFile::ReadString si respectiv CStdioFile::WriteString menite sa faca viata mai usoara MFC-istilor care lucreaza cu asazisele fisiere text, adica formate din "linii" ;) delimitate prin "\r\n" sau '\n'.

// scuze pentru raspunsul intarziat. am fost plecat cateva zile.

User avatar
Popa Alin
Membru
Membru
Posts: 52
Joined: 30 May 2008, 11:00
Judet: Timiş
Location: Timisoara

Re: Scriere in fisier la o anumita pozitie

Post by Popa Alin » 16 Sep 2008, 14:56

Ovidiu Cucu wrote:Well, mai pe scurt, mai pe romaneste si mai placut urechilor, CStdioFile fiind derivat din CFile stie (aproape) tot ce stie sa faca si clasa de baza dar adauga doua metode CStdioFile::ReadString si respectiv CStdioFile::WriteString menite sa faca viata mai usoara MFC-istilor care lucreaza cu asazisele fisiere text, adica formate din "linii" ;) delimitate prin "\r\n" sau '\n'.

// scuze pentru raspunsul intarziat. am fost plecat cateva zile.

woooooow nice. Mersic fain de informatie.

P.S. Nu-i nimic ca ai intarziat cu raspunsul.
Great minds disscuss ideas, average minds disscuss events, small minds disscuss people.

Post Reply