VC++/Szövegszerkesztő-Fájlkezelés

VC++/Szövegszerkesztő-Fájlkezelés
2006-03-12T10:55:37+01:00
2006-03-26T11:39:04+02:00
2022-10-29T20:00:46+02:00
csz1978
Kezdő programozó vagyok és Visual C++-ban a Seralization-ban fájl megnyitásakor fájl nevet kér. De az Archive& ar-ban ezt nem találtam igy nem tudtam megnyitni a fájlt csak Stream-ban ott viszont adatfájlként menti a fájlt, DE nekem csak a fájl Szöveges tartalma kellene és a megnyitott fájlt ne irja át adatfájlnak.
Probálkoztam CFile-ben is de nem sikerült megcsinálnom.
Emil címem:CSZ1978@freemail.hu
CSZ
Mutasd a teljes hozzászólást!
CStdioFile-t valoban ciklusba kell rakni. Alatta meg a mentes / toltes. A view richeditview nalam. Ez igy ANSI (MBCS) kod. Ha unikodos exebol unicode fileba akarsz menteni akkor * sizeof(TCHAR) ha pedig ansi formatumba akkor kell egy WideCharToMultiByte is.

CString str, text; do { if (f.ReadString(str)) text += str; } while(!feof(f))

BOOL CSdiDoc::OnSaveDocument(LPCTSTR lpszPathName) { BOOL retval = TRUE; CString str; CFile f; try { GetView()->GetWindowText(str); f.Open(lpszPathName, CFile::modeCreate|CFile::modeWrite); f.Write((LPCTSTR)str, str.GetLength() * sizeof(TCHAR)); f.Close(); } catch (CException *e) { e->ReportError(); e->Delete(); retval = FALSE; } SetModifiedFlag(!retval); return retval; } BOOL CSdiDoc::OnOpenDocument(LPCTSTR lpszPathName) { PCHAR pbuf = NULL; DWORD length; BOOL retval = TRUE; CFile f; try { f.Open(lpszPathName, CFile::modeRead); length = f.GetLength(); pbuf = new CHAR[length + 1]; f.Read(pbuf, length); f.Close(); pbuf[length] = 0; GetView()->SetWindowText(pbuf); } catch (CException *e) { e->ReportError(); e->Delete(); retval = FALSE; } if (pbuf) delete pbuf; return retval; }
Mutasd a teljes hozzászólást!

  • Nehany pelda file -kezelesre:
    itt
    itt is
    Mutasd a teljes hozzászólást!
  • Köszi a példákat
    Olyan problémám lenne még hogy a Seralize csak adatfájjal dolgozik és ha én megnyitok egy szöveges fáljt akkor átalakítja adatfáljá!
    Van erre valami ötleted?

    CSZ
    Mutasd a teljes hozzászólást!
  • A fájlkezelést odáig megcsináltam hogy kiirja a képernyőre, de mentéskor átalakítja adat fáljá!
    Ezt el lehet valahogy kerülni?
    Mutasd a teljes hozzászólást!
  • Nezd meg az MSDN -ben.NEm tudomm,mar nem emlekszem.DE kell legyen megoldas ra.
    Mutasd a teljes hozzászólást!
  • Hagyd ki az archivokat a filekezelesbol. Van a CDocument-nek OnSaveDocument es OnOpenDocument virtualis metodusa amit irj felul. Mindkettonek a parametere a kivalasztott filenev amit CStdioFile-al celszeru hasznalni ha mar a szovegfile a kriterium.
    Mutasd a teljes hozzászólást!
  • Köszönöm kipróbálom!
    Nem tudod hogy ha RichEditText-ben
    is müködik-e a felülírás?

    CSZ
    Mutasd a teljes hozzászólást!
  • Ezek a metodusok a dokumentum osztalyhoz tartoznak. A richedittext (CRichEditView leszarmazott?)-bol szedd ki az adatokat mentesnel valahogy igy:

    BOOL CSajatDoc::OnSaveDocument(LPCTSTR lpszPathName) { CString str; CStdioFile f; m_pView->GetWindowText(str); f.Open(lpszPathName, CFile::modeCreate|CFile::modeText); f.WriteString(str); f.Close(); return TRUE; }
    Mutasd a teljes hozzászólást!
  • Kipróbáltam amit irtál, ez let belőle


    BOOL CMon3Doc::OnOpenDocument(LPCTSTR lpszPathName) { if (!CRichEditDoc::OnOpenDocument(lpszPathName)) return FALSE; CString str(NULL); CStdioFile f; f.Open(lpszPathName, CFile::modeCreate|CFile::typeText);//typeText f.ReadString(str); m_Edit.SetWindowText(str); f.Close(); // TODO: Add your specialized creation code here return TRUE; } BOOL CMon3Doc::OnSaveDocument(LPCTSTR lpszPathName) { // TODO: Add your specialized code here and/or call the base class CString str; CStdioFile f; f.Open(lpszPathName, CFile::modeCreate|CFile::typeText);//typeText m_Edit.GetWindowText(str); f.WriteString(str); f.Close(); return CRichEditDoc::OnSaveDocument(lpszPathName); }

    És kiadja megnyitáskor hogy az str!=NULL!
    MI VAN?!?
    Nem értem
    Segíts ha tudsz
    CSZ
    Mutasd a teljes hozzászólást!
  • Egyik esetben sem kell meghivnod az ososztaly metodusat. Mindkettonel return TRUE ha sikeres FALSE ha sikertelen a muvelet. OnSaveDocument-nel egy SetModifiedFlag(FALSE) sem art ha sikerult menteni. Figyeld a file muveletek visszateresi erteket (TRY/CATCH leginkabb) es az alapjan allitsd be a fuggveny visszateresi erteket.

    Az OnSaveDocument-ben a CFile::modeCreate-hez lehet, hogy kell egy CFile::modeWrite is. Az OnOpenDocument-ben viszont CFile::modeRead kell modeCreate helyett.
    Mutasd a teljes hozzászólást!
  • Kipróbáltam amit irtál:

    CString str; CStdioFile f; f.Open(lpszPathName, CFile::modeRead|CFile::typeText); f.ReadString(str); m_Edit.SetWindowText(str); f.Close(); return TRUE; } CStdioFile f; f.Open(lpszPathName, CFile::modeRead|CFile::typeText); BYTE *pText; long size=f.GetLength(); pText= new BYTE[size+1]; if( pText==NULL ) AfxMessageBox(" A file tul nagy!"); else { f.Read(pText,size); m_Edit.SetWindowText((const char *)pText); } return TRUE; }
    Ez két verzio az OPEN-ra.
    az első CStdio file-os, az ReadString miatt csak az első sort olvassa be, Hogy lehet sort lépni?
    A második a CFile-os beolvassa a fájt de hagy "szemetet a végén". a long size=f.GetLength(); miatt szerintem?!?!
    Van valami ötleted.
    A TRY/CATCH -ot nem értem pedig megnéztem MSDN-ben is.

    CSZ
    Mutasd a teljes hozzászólást!
  • Hogy lehet sort lépni?hasonloan:

    while f.eof() { f.ReadString(str); }
    Mutasd a teljes hozzászólást!
  • CStdioFile-t valoban ciklusba kell rakni. Alatta meg a mentes / toltes. A view richeditview nalam. Ez igy ANSI (MBCS) kod. Ha unikodos exebol unicode fileba akarsz menteni akkor * sizeof(TCHAR) ha pedig ansi formatumba akkor kell egy WideCharToMultiByte is.

    CString str, text; do { if (f.ReadString(str)) text += str; } while(!feof(f))

    BOOL CSdiDoc::OnSaveDocument(LPCTSTR lpszPathName) { BOOL retval = TRUE; CString str; CFile f; try { GetView()->GetWindowText(str); f.Open(lpszPathName, CFile::modeCreate|CFile::modeWrite); f.Write((LPCTSTR)str, str.GetLength() * sizeof(TCHAR)); f.Close(); } catch (CException *e) { e->ReportError(); e->Delete(); retval = FALSE; } SetModifiedFlag(!retval); return retval; } BOOL CSdiDoc::OnOpenDocument(LPCTSTR lpszPathName) { PCHAR pbuf = NULL; DWORD length; BOOL retval = TRUE; CFile f; try { f.Open(lpszPathName, CFile::modeRead); length = f.GetLength(); pbuf = new CHAR[length + 1]; f.Read(pbuf, length); f.Close(); pbuf[length] = 0; GetView()->SetWindowText(pbuf); } catch (CException *e) { e->ReportError(); e->Delete(); retval = FALSE; } if (pbuf) delete pbuf; return retval; }
    Mutasd a teljes hozzászólást!

  • Isten vagy.
    Köszönöm szépen a segítséget.
    Ha Szeged fele jársz küldj emilt, meghívlak valmire.

    CSZ
    Mutasd a teljes hozzászólást!
  • Azert en gondoltam,hogy tovabb mar logikus a kerdezonek,de nem:)
    Mutasd a teljes hozzászólást!
Tetszett amit olvastál? Szeretnél a jövőben is értesülni a hasonló érdekességekről?
abcd