Avatar billede kreinoee Nybegynder
19. maj 2008 - 12:49 Der er 5 kommentarer og
1 løsning

Lagersegmentfejl ved listning af filer/mapper i en mappe

Hej.

Sidder og roder med et program i c++ som skal scanne en mappe igennem og gøre forskellige ting med filerne i den.

Jeg har fået den til at finde alle filerne i mappen, og jeg kan også skælne dem mellem mapper og filer, men jeg for tilgængeld en lagersegmentfejl inden den når alle filerne i gennem. Jeg regner med at det enten er fordi ikke for renset ud i hukommelsen, eller fordi jeg på en eller anden måde skal have alloceret noget mere hukommelse, men er ny til c++ og kan ikke rigtigt gennemskue det, så håber i kan give mig et vink i den rigtige retning.

Koden ser således ud:

int main(int argc, char** argv)
{
    char sti[] = "/var/log";
    int antalFiler;
    struct direct ** filer;

    antalFiler = scandir(sti, &filer, filVaelger, alphasort);
    cout << antalFiler << endl;
    for (int i = 1; i <= antalFiler; i++)
      {
        struct stat * s;
        string fuldeSti = "/var/log/";
        fuldeSti.append (filer[i-1]->d_name);
        if (lstat (fuldeSti.c_str () , s) == 0)
          cout << "lykkes";
        //cout << errno;
       
        cout << filer[i - 1]->d_name << "          " << S_ISDIR(s->st_mode) <<  endl;
        delete s;
       
    }
   
int filVaelger(const struct dirent *filNavn) {
    if (strcmp(filNavn->d_name, ".") == 0 || strcmp(filNavn->d_name, "..") == 0)
        return 0;
    else
        return 1;
   
};
Avatar billede arne_v Ekspert
19. maj 2008 - 15:28 #1
Der mangler jo en masse kode, saa det er rent gaetvaerk.

Men jeg gaetter paa at:

struct direct **filer;

skal vaere:

struct direct *filer;

fordi du jo kalder scandir med &filer !
Avatar billede kreinoee Nybegynder
20. maj 2008 - 09:10 #2
scandirs parameter skal rent faktisk have en dirent***, men den compiler fint så det er ikke der problemet er.

Jeg skal prøve at gøre det lidt mere specifikt. Det er enlig et meget simpelt program, i Første fase Ville jeg bare have den til at skrive alle filerne i en mappe, hvilket jeg også har fået til at virke, derefter ville jeg have den til at skrive om filerne er mapper eller filer, hvilket den så ikke vil. Koden nedenfor er den fulde kode. De udkommenterede linjer er de linjer som er tilføjet for at finde ud af om filen er en mappe eller en fil, og programmet virker uden dem, så det må være i dem problemet ligger:

/*
* File:  Main.cpp
* Author: anders
*
* Created on 6. maj 2008, 12:18
*/

#include <stdlib.h>
#include <string.h>
#include <dirent.h>
#include <dirent.h>
#include <stdio.h>
#include <unistd.h>
#include <unistd.h>
#include <errno.h>
#include <string.h>
#include <dirent.h>
#include <string.h>
#include <netdb.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <sys/socket.h>
#include <iostream>
#include <arpa/inet.h>
#include <sys/dir.h>
#include <sys/stat.h>
#include <sys/param.h>
#include <limits.h>

using namespace std;



int filVaelger(const struct dirent *filNavn) {
    if (strcmp(filNavn->d_name, ".") == 0 || strcmp(filNavn->d_name, "..") == 0)
        return 0;
    else
        return 1;
   
};

extern int alphasort();

/*
*
*/
int main(int argc, char** argv)
{
    //runningConfig.stiDerSkalScannes = "/var/log";
    char sti[] = "/var/log";
    int antalFiler;
    struct dirent ** filer;

    antalFiler = scandir(sti, &filer, filVaelger, alphasort);
    cout << antalFiler << endl;
    for (int i = 1; i <= antalFiler; i++)
      {
        //struct stat * s;
        //string fuldeSti = "/var/log/";
        //fuldeSti.append (filer[i-1]->d_name);
        //if (lstat (fuldeSti.c_str () , s) == 0)
        //  cout << "lykkes";
       
       
        //cout << filer[i - 1]->d_name << endl << "          " << S_ISDIR(s->st_mode) <<  endl;
        //delete s;
       
        cout << filer[i - 1]->d_name << endl;
    }
   
    return (EXIT_SUCCESS);
}
Avatar billede kreinoee Nybegynder
20. maj 2008 - 09:13 #3
Skal lige tilføje at det kun er de udkommenterede linjer i forløkken, linjen
//runningConfig.stiDerSkalScannes = "/var/log";
har med et andet forsøg og gøre, og bliver ikke brugt endnu.
Avatar billede segmose Nybegynder
20. maj 2008 - 14:57 #4
struct stat * s; // <--- Fejlen er her, der er ikke allokeret noget lager ...
string fuldeSti = "/var/log/";
fuldeSti.append (filer[i-1]->d_name);
if (lstat (fuldeSti.c_str () , s) == 0) // parameter 2 skal være en buffer.
Avatar billede kreinoee Nybegynder
21. maj 2008 - 14:39 #5
Takker. Har fået det til at virke nu.

Har programeret en lille smule i C for lang tid siden, så kunne se det med det samme du skrev det, men kunne bare ikke selv få øge på det :(
Avatar billede segmose Nybegynder
21. maj 2008 - 14:55 #6
Hvis du har slået den warning til der fortæller dig om uinitialiserede variable burde din compiler fortælle dig om sådanne fejl.
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