Avatar billede simon.ulsnes Nybegynder
03. marts 2001 - 11:43 Der er 8 kommentarer og
1 løsning

Åbn fil UDEN MFC

Hej eksperter!
Jeg er ved at lave en lille teksteditor beregnet til kildeeditering til f.eks. websider (som om der ikke findes nok i forvejen). Nå, men anyway, så har jeg valgt at undlade at bruge MFC, for jeg kan bedre lide det uden, og både kilde og EXE fylder meget mindre.
Nu mangler jeg imidlertid kun en ting i programmet, som så til gengæld også er den vigtigste: Hvordan håndterer jeg filerne?
Jeg bruger et edit window som tekstkontrol, og så bruger jeg SetWindowText(...) til at sætte indholdet af den.

Jeg skal bruge en metode hvorpå jeg kan læse indholdet af en normal tekstfil, og derefter putte indholdet i edit-kontrollen.
Jeg har prøvet at bruge CFile (og ja, jeg har inkluderet MFC-filerne før jeg gjorde det), men jeg fik hvad der svarer til en ulovlig handling så snart jeg kørte programmet (jeg bruger Windows 2000).

Til at starte med, har jeg placeret en tekstfil i roden (c:\\) som jeg har kaldt textfile.txt. Den vil jeg så have åbnet og vist ved programmets start. Hvordan gør jeg det?

På forhånd mange tak for hjælpen!

/ Simon
Avatar billede borrisholt Novice
05. marts 2001 - 06:35 #1
hej Simon

Prøv det her :

koden er ikke testet men virket i store træk ...

SAVE :

        char fnbuf[32768];
        memset(&fnbuf, 0, sizeof(fnbuf));
        sprintf(fnbuf, \"%s.snt\", (char *)(dti->GetiObj()->GetName()));
        OPENFILENAME ofn;
        memset(&ofn, 0, sizeof(ofn));
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = *TopFrame;
        ofn.lpstrFilter = \"StringNameTable (*.snt)\\0*.SNT\\0All files (*.*)\\0*.*\\0\\0\";
        ofn.nMaxFile = 32768;
        ofn.lpstrFile = fnbuf;
        ofn.lpstrInitialDir = \"\";
        ofn.Flags = OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOTESTFILECREATE | OFN_EXPLORER | OFN_LONGNAMES;
        ofn.lpstrDefExt = \"SNT\";

        if(GetSaveFileName(&ofn))
        {
            HANDLE file = CreateFile(fnbuf, GENERIC_WRITE, 0, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
              char LangStr[2000];
                      GetWIndowText(handle,LangStr);
                      WriteFile(file, (char *) LangStr, strlen(LangStr), &BytesWritten, NULL);
                CloseHandle(file);

                }

LOAD :

    char fnbuf[32768];
        memset(&fnbuf, 0, sizeof(fnbuf));
        sprintf(fnbuf, \"%s.snt\", (char *)(dti->GetiObj()->GetName()));
        OPENFILENAME ofn;
        memset(&ofn, 0, sizeof(ofn));
        ofn.lStructSize = sizeof(ofn);
        ofn.hwndOwner = *TopFrame;
        ofn.lpstrFilter = \"StringNameTable (*.snt)\\0*.SNT\\0All files (*.*)\\0*.*\\0\\0\";
        ofn.nMaxFile = 32768;
        ofn.lpstrFile = fnbuf;
        ofn.lpstrInitialDir = \"\";
        ofn.Flags = OFN_NOCHANGEDIR | OFN_OVERWRITEPROMPT | OFN_HIDEREADONLY | OFN_NOTESTFILECREATE | OFN_EXPLORER | OFN_LONGNAMES;
        ofn.lpstrDefExt = \"SNT\";
   
              if(GetOpenFileName(&ofn))
        {
            FILE *stream = fopen( fnbuf, \"r\" );
   
        if(stream != NULL)
            {
                char buf[100];
                char buf1[100];
                ZeroMemory(buf,100);
                while( !feof( stream ) )
                {
                    fgets( line, 200, stream );
//Stop den læste linje ind i dit memo flet
                                }


                          }
                fclose( stream );


Jens B
Avatar billede moykal Nybegynder
10. marts 2001 - 16:42 #2
Kort sagt: Anvend API\'er. Jeg skal ikke blande mig i ovenstående eksempel. Men hvis du bruger C++, så kan man altså komme langt simplere igennem med:

#include <fstream>

// Nu vil jeg læse fra filen:

#define BIG_BUFFER_SIZE 10000000
ifstream in(\"c:\\\\textfile.txt\");
char pszBuffer = new char[BIG_BUFFER_SIZE]; // Vi \"new\'er\" da vi nok regner med at buffere af denne størrelse skal ligge på heapen
in >> pszBuffer;

// Nu vil jeg skrive til filen:
ofstream out(\"c:\\textfile.txt\");
// Gør hvad end du vil for at hente teksten fra edit-kontrollen ned i en char-buffer, og så:
out << pszBuffer;

Hvis du som jeg også hader MFC, så vil jeg anbefale dig at kigge på WTL. Samme interface som MFC, kodestørrelse omkr. 10 pct. af tilsvarende (statisk linket) MFC. WTL kommer som en del af det man kan downloade ifm. Platform SDK. Du kan læse mere om det på Developmentors side:

http://www.develop.com/dm/dev_resources.asp
Avatar billede borrisholt Novice
11. marts 2001 - 08:51 #3
moykal  >> Mit eksemple er også i C++. Jeg har bare sat Open og Close dialoger på også ..

Jens B
Avatar billede moykal Nybegynder
12. marts 2001 - 11:22 #4
Ja - det kan du sige. Og du har ret i den forstand at ANSI-C er et ægte subset af ISO C++. Men at du anvender OPENFILENAME struct\'en gør det jo ikke objekt-orienteret eller i nogen grad C++-agtigt. Det er API-programmering. Og en C-kompiler ville kunne klare eksemplet ligeså godt som en C++-compiler. Du må da indrømme at når man anvender sprintf i stedet for strstream, FILE i stedet for fstream, så er man mere C-programmør end C++-programmør. Jeg ser også kun anvendelsen af CreateFile til hardcore I/O altså mod ægte devices eller hvis man skal bruge filer ifm. sharing, asynkron skrivning (OVERLAPPED) etc. Ikke mod alm. simpel engangs-tekstskrivning. Der kan standard-biblioteket gøre et ligeså godt og mere forståeligt stykke arbejde.
Avatar billede brian@diku Nybegynder
14. marts 2001 - 17:51 #5
hvis spørgsmålet er som i subject .. så kig i følgende eksempel:

void readFileIntoList(char* filename){
ifstream file(filename);
char ch;
char s [1024];

if (file) {
while(file.eof()==false) {
file.getline(s,80);
cout << s2 << end;
}
} else {
cout << \"failed to åben\" << end;
}
file.close();
}
Avatar billede brian@diku Nybegynder
14. marts 2001 - 17:52 #6
der er lidt bøvet at jeg ikke fik ændret funktions navnet, sorry
Avatar billede simon.ulsnes Nybegynder
18. marts 2001 - 13:58 #7
borrisholt:
Jeg valgte at bruge dit forslag, for så slog jeg to fluer med et smæk (CommCtrl og selve åbningen).
Nu har jeg siddet og leget lidt med koden, og jeg nu to spørgsmål:

1. Hvor får du dti fra? Jeg får en fejlmeddelelse under compiling, medmindre jeg erstatter hele argumentet med NULL.

2. Når jeg får åbnet en fil med linjeskift i, kommer der ingen linjeskift i selve edit-boksen, men kun nogle mærkelige firkanter.

På forhånd tak for hjælpen!

/ Simon
Avatar billede borrisholt Novice
19. marts 2001 - 06:37 #8
Simon >> dti skal du ikke bruge til noget, og har ikke noget med sagen at gøre det havde den blot det hvor jeg oprindeligt skrev koden .....

dti bruger jeg til at helde noget fornuftigt ind i fnbuf. fnbuf bliver brugt som defult værsi i openDialog eksemplet ... Så find selv på noget fornuftigt

Jens B
Avatar billede simon.ulsnes Nybegynder
19. marts 2001 - 13:28 #9
OK, men hvordan undgår jeg de mærkelige firkanter (jeg har fundet ud af at de svarer til escape-koder - \\t giver også f.eks. en firkant)?

/ Simon
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester