Avatar billede mobi2 Nybegynder
26. april 2000 - 18:07 Der er 15 kommentarer og
1 løsning

Fil håndtering i C

Indlæs det antal filer fra et dir der har extension .txt, antallet kan skifte fra gang til gang, og efter filerne er indlæst, er det meningen at man skal kunne hente hver af dem og læse indholdet af den enkelte fil....

Det rider mig bare som en mare, og jeg har bare brugt så meget tid på det nu.
Please en eller anden HJÆÆÆÆÆÆÆÆLP!!! :(
Avatar billede dmk Nybegynder
26. april 2000 - 18:47 #1
Hejsa.

Hvis det er til Windows, kan du benytte funktionerne FindFirstFile, FindNextFile og FindClose.

FindFirstFile tager en parameter FILENAME, og her kan du give den "c:\documents\*.txt", og den vil så søge efter txt filer i pathen c:\documents. Det er nok den simpleste løsning.

//--------------------------------------------
WIN32_FIND_DATA FindData;
HANDLE FindHandle=FindFirstFile("c:\\documents\\*.txt", &FindData);
bool FindOk;
if (FindHandle) FindOk=true;
else FindOk=false;
while (FindOk)
{
  char* FileName=FindData.cFileName;
  //... gør noget med FileName
FindOk=FindNextFile(FindHandle, FindData);
}
FindClose(FindHandle);

//--------------------------------------------
Sådan noget i den stil...

Spørg endelig!

DMK
Avatar billede mobi2 Nybegynder
26. april 2000 - 18:54 #2
Jeg har brugt den der findfirst, og findnext, men af underlige årsager, kan jeg ikke komme til at få mere en den sidste fil. Hvis der f.eks. er 6 filer, kan jeg kun læse den sidste fil fra et array... for det er det jeg gerne vil lægge det i en anden funktion der så gør hvad den nu skal gøre, returnere til funktionen, finde næste fil, gøre hvad..... osv. men det vil ikke som jeg vil.... jeg bruger Turbo C++ hvis det er en hjælp
Jeg kan ikke finde ud af bruge VC++ så det kommer det aldrig til....
Avatar billede dmk Nybegynder
26. april 2000 - 18:56 #3
Prøv at læg koden op, så kan jeg lige kigge på den (muligvis først i morgen).

DMK
Avatar billede mobi2 Nybegynder
26. april 2000 - 18:56 #4
Bare spørg efter min kode, hvis du ellers tør, det er ved at værre godt rodet...
Avatar billede dmk Nybegynder
26. april 2000 - 18:58 #5
Det er i orden, jeg har nok set sådan noget før...

DMK
Avatar billede mobi2 Nybegynder
26. april 2000 - 19:00 #6
Jeg ville dog håbe på at du måske havde to sek nu, for jeg er snart grædefærdig... :o|
Avatar billede dmk Nybegynder
26. april 2000 - 19:01 #7
Okay, men så skal det også være NU! Jeg er næsten på vej hjem...

DMK
Avatar billede mobi2 Nybegynder
26. april 2000 - 19:01 #8
ok her er den:


// dato: 26/4/2000
// Heino Radmer

#include <stdio.h>
#include <dir.h>
#include <iostream.h>
#include <conio.h>
#include <string.h>

void Write_File_Names(const int size)
{
    char *names[1];
    for(register i = 0; i < size; i++)
        cout<<names[i];
    cout<<"\tWRITE_FILE_NAMES!!!\n";
    getch();
}


int Read_File_Names(const int size)
{
    char *names[1];
    struct ffblk ffblk;
    char name[128];
    int done;
    int x=0;
//    char *names[8];
    for(register i = 0; i < size; i++)
    {
//        cout<<"names["<<i<<"] = ";
//        cin>>name;
        done = findfirst("c:\\otdr\\test1\\*.asc",&ffblk,0);
        while (!done)
        {
//            printf("\t%s\n", ffblk.ff_name);
            done = findnext(&ffblk);
//            ffblk.ff_name==name;
            cout<<ffblk.ff_name<<endl;
//            getch();
            names[i] = new char[strlen(ffblk.ff_name)+1];
            strcpy(names[i],ffblk.ff_name);
            cout<<names[i]<<"\n";
            Write_File_Names(1);
            getch();
            x++;
//            done = findnext(&ffblk);
        }
    }
    return x;
}

/*
void Write_File_Names(const int size)
{
    char *names[];
    for(register i = 0; i < size; i++)
        cout<<names[i];
    cout<<"\tWRITE_FILE_NAMES!!!\n";
    getch();
}
*/
int main(void)
{
//    char *names[8];
    char sti[]="c:\\otdr\\test1\\*.asc";
    int i=0;
    int files;
    clrscr();

    Read_File_Names(1);

//    cout<<"\nProcessed "<<files<<" files";
//    getch();

//    Write_File_Names(names,1);

//    getch();
    return 0;
}
Avatar billede mobi2 Nybegynder
26. april 2000 - 19:04 #9
Write_File_Names, skiftes ud med en mere kompliceret funktion, men det er bare grund ideen til det..
Avatar billede dmk Nybegynder
26. april 2000 - 19:04 #10
Så vidt jeg kan se, bruger du ikke FindFirstFile og FindNextFile, som jeg har foreslået, men derimod findfirst og findnext, som ikke er det samme! Jeg kan ikke finde funktionerne i min hjælp.

Prøv at bytte det ud med noget af det jeg skrev. Jeg er ret sikker på, at det vil fungere noget bedre.

DMK
Avatar billede mobi2 Nybegynder
26. april 2000 - 19:06 #11
ok, prøver det...
er du sikker på at FindFirstFile og FindNextFile ikke kun er til Visual C++???
Avatar billede dmk Nybegynder
26. april 2000 - 19:12 #12
Ja, det er jeg rimelig sikker på. Jeg har selv brugt dem i Borland.

Det skulle gerne være en del af Windows API'et.

DMK
Avatar billede mobi2 Nybegynder
26. april 2000 - 19:16 #13
hmmm jeg må ha en pokkers gammel versíon a TC, for jeg har ikke fundet dem, kun i VC++...... jeg har ikke tid til at finde en ny compiler.... så jeg må vel finde på noget andet... tak for hjælpen alligevel
Avatar billede dmk Nybegynder
26. april 2000 - 19:49 #14
Kan din TC ikke finde FindFirstFile? Har du included de rigtige headere? Jeg ved ikke lige hvilken header du skal bruge, men det kan du se i din VC.

DMK
Avatar billede mobi2 Nybegynder
26. april 2000 - 19:55 #15
Det er io.h, men de findes ikke i den header fil som jeg har i min TC... jeg ved det ikke, men jeg tror så små at jeg har løst problemet på en anden måde... men man ved jo aldrig!
Avatar billede jinxed Nybegynder
27. april 2000 - 09:36 #16
Prøv med følgene:

#include <stdio.h>
#include <dir.h>
#include <iostream.h>
#include <conio.h>
#include <string.h>

void Write_File_Names(const int size)
{
    char *names[1];
    for(register i = 0; i < size; i++)
        cout<<names[i];
    cout<<"\tWRITE_FILE_NAMES!!!\n";
    getch();
}


int Read_File_Names(const int size)
{
    char *names[1];
    struct ffblk ffblk;
    char name[128];
    long done;
    int x=0,done2=0;
//    char *names[8];
    for(register i = 0; i < size; i++)
    {
//        cout<<"names["<<i<<"] = ";
//        cin>>name;
        done = findfirst("c:\\otdr\\test1\\*.asc",&ffblk,0);
        while (!done2)
        {
//            printf("\t%s\n", ffblk.ff_name);
            done2 = findnext(done,&ffblk);
//            ffblk.ff_name==name;
            cout<<ffblk.ff_name<<endl;
//            getch();
            names[i] = new char[strlen(ffblk.ff_name)+1];
            strcpy(names[i],ffblk.ff_name);
            cout<<names[i]<<"\n";
            Write_File_Names(1);
            getch();
            x++;
//            done = findnext(&ffblk);
        }
        findclose(done);
    }
    return x;
}

/*
void Write_File_Names(const int size)
{
    char *names[];
    for(register i = 0; i < size; i++)
        cout<<names[i];
    cout<<"\tWRITE_FILE_NAMES!!!\n";
    getch();
}
*/
int main(void)
{
//    char *names[8];
    char sti[]="c:\\otdr\\test1\\*.asc";
    int i=0;
    int files;
    clrscr();

    Read_File_Names(1);

//    cout<<"\nProcessed "<<files<<" files";
//    getch();

//    Write_File_Names(names,1);

//    getch();
    return 0;
}
Det er dog frit fra hukommelsen....

Den long findfirst() returnerer må du ikke ændre(skal bruges til findnext() og findclose()).

findnext() skal havde et search handle ( den long som findfirst() returnerer) som første parameter, ffblk'en som den anden.

Du skal huske at bruge findclose(searchhandle) til at lukke resourcerne til søgningen(er aktuelt hvis dit program skal holdes kørerne i længere tid af gangen).

Jinxed ; ]
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