illegal seek

Tein ohjelman jossa on looppi joka avaa aina yhden kuvan kerrallaan kansiosta ja prosessoi sen.

Virheilmoituksen näyttäjänä laitoin perror("fopen"); joka ilmoittaa loopin ensimmäisen kuvan aukeavan hyvin kun seuraavissa kuvissa tulee "open success" tilalla "illegal seek".
Mistähän tämä johtuu ja miten sais loputkin kuvat aukeamaan kunnolla?

toinen ongelma:
Looppi ottaa mukaan ja prosessoi "." ja ".." ovatko sitten kansioita ja miten ne sais ohitettua?
13466
Äänestä

Muut lukivat myös

Vastaukset 13

Vanhimmat

>toinen ongelma:
>Looppi ottaa mukaan ja prosessoi "." ja ".." ovatko sitten kansioita ja miten ne sais >ohitettua?

. on käsiteltävä hakemisto ja .. edellinen.
Jos tiedostonimet on char taulukossa niin voit jättää käsittelemättä ne
if(!strcmp(fileName, ".") ||!strcmp(fileName, "..")) continue; // jos esim while loopissa

Äänestä

mistä sen muuten voi tietää, että mikä on vialla?

Yrität lukea sitä edellistä kuvaa vielä tai jotain vastaavaa.

Äänestä
  • while(pent=readdir(pdir))
    {tiedostonimi = pent->d_name;
    printf("%s\n",tiedostonimi);
    fd = fopen(argv[0], "r");
    perror("open");

    fseek(fd, 15, SEEK_SET);
    fp->data_size = fread(fp->data, 1, DPFP_IMG_HEIGHT * DPFP_IMG_WIDTH, fd);

    fclose(fd);
    //sitten tulee kuvan prosessointia.....
    }

    Niin eikö tuossa kuitenkin edellinen kuva suljeta vai miksi se illegal seek tulee?

    Äänestä

  • jannu72 kirjoitti:

    while(pent=readdir(pdir))
    {tiedostonimi = pent->d_name;
    printf("%s\n",tiedostonimi);
    fd = fopen(argv[0], "r");
    perror("open");

    fseek(fd, 15, SEEK_SET);
    fp->data_size = fread(fp->data, 1, DPFP_IMG_HEIGHT * DPFP_IMG_WIDTH, fd);

    fclose(fd);
    //sitten tulee kuvan prosessointia.....
    }

    Niin eikö tuossa kuitenkin edellinen kuva suljeta vai miksi se illegal seek tulee?

    Jos kuvia haluat käsitellä niin ne on avattava binaarisena. Eli avaa ne "b" argumentilla.
    Toiseksi, nyt avaat aina argv[0] muuttujaan määriteldyn tiedoston kun sun pitäisi avata tiedostonimi muuttujassa oleva tiedosto.

    "." tarkoittaa nykyistä kansiota ja ".." tarkoittaa edellistä kansiota. ne pystyy poistamaan if lauseella.

    ...
    if(!strcmp(tiedostonimi,".") || !strcmp(tiedostonimi,".."))
    continue;
    ...
    fd = fopen(tiedostonimi,"br");
    ...

    Äänestä

  • Johnnie83 kirjoitti:

    Jos kuvia haluat käsitellä niin ne on avattava binaarisena. Eli avaa ne "b" argumentilla.
    Toiseksi, nyt avaat aina argv[0] muuttujaan määriteldyn tiedoston kun sun pitäisi avata tiedostonimi muuttujassa oleva tiedosto.

    "." tarkoittaa nykyistä kansiota ja ".." tarkoittaa edellistä kansiota. ne pystyy poistamaan if lauseella.

    ...
    if(!strcmp(tiedostonimi,".") || !strcmp(tiedostonimi,".."))
    continue;
    ...
    fd = fopen(tiedostonimi,"br");
    ...

    Nuo . ja .. kansion ohitukset olen saanut onnistumaan hyvin siinä ei ongelmia.

    Kokeilin vaihtaa fd = fopen(tiedostonimi, "br"); ja sitten muutenkin avata "b"-argumentilla mutta tuloksena
    open: Invalid argument Muistialueen ylitys

    Äänestä

  • jannu72 kirjoitti:

    Nuo . ja .. kansion ohitukset olen saanut onnistumaan hyvin siinä ei ongelmia.

    Kokeilin vaihtaa fd = fopen(tiedostonimi, "br"); ja sitten muutenkin avata "b"-argumentilla mutta tuloksena
    open: Invalid argument Muistialueen ylitys

    outo virhe sinänsä, eikö se kerro mitään muuta?

    Tarkistan vielä koska et sitä kertonut
    tiedostonimi on tyyppiä char* eikä char[]?
    fd on tyyppiä FILE*?

    Äänestä

  • Johnnie83 kirjoitti:

    outo virhe sinänsä, eikö se kerro mitään muuta?

    Tarkistan vielä koska et sitä kertonut
    tiedostonimi on tyyppiä char* eikä char[]?
    fd on tyyppiä FILE*?

    Jep char on tyyppiä char* ja fd on tyyppiä FILE*

    Äänestä

  • jannu72 kirjoitti:

    Jep char on tyyppiä char* ja fd on tyyppiä FILE*

    mikä structi toi fp on? Voisitko liittää sen mukaan?
    luulenpa että se "Muistialueen ylitys" tulee siitä että kuvan koko x leveys ei mahdu siihen fp->dataan.

    Äänestä

  • Johnnie83 kirjoitti:

    mikä structi toi fp on? Voisitko liittää sen mukaan?
    luulenpa että se "Muistialueen ylitys" tulee siitä että kuvan koko x leveys ei mahdu siihen fp->dataan.

    structi viittaa käyttämääni kirjastoon eli struct fprint *fp = fprint_alloc();

    En tiedä vaikuttaisko kuvan koko muistialueen ylitykseen tai voi olla kun on tehty nämä muutokset..

    Ilman näitä edellisiä "b" argumentin käyttöä ym. muutoksia yhdellä kuvalla tämä toimii mutta kun tein loopin niin seuraavien kuvien kohdalla ilmestyy se illegal seek.

    Äänestä

  • jannu72 kirjoitti:

    structi viittaa käyttämääni kirjastoon eli struct fprint *fp = fprint_alloc();

    En tiedä vaikuttaisko kuvan koko muistialueen ylitykseen tai voi olla kun on tehty nämä muutokset..

    Ilman näitä edellisiä "b" argumentin käyttöä ym. muutoksia yhdellä kuvalla tämä toimii mutta kun tein loopin niin seuraavien kuvien kohdalla ilmestyy se illegal seek.

    Niin miten tuon kanssa nyt tekisi? Jääkö tuo kuvan prosessointi jotenkin muistiin että seuraavassa loopissa sen takia tulisi virhe?

    Äänestä

Elikkä tässä koodi kokainaisuudessaan. Miten saa onnistumaan että joka loopilla avaa kuvan ja sulkee onnistuneesti? Nyt ei näyttäis toimivan kuin ensimmäiselle kuvalle.

#include
#include
#include
#include
#include

int main(int argc, char *argv[])
{
char *polku="pictures/";
char *tiedostonimi;
DIR *pdir = opendir(polku);
struct dirent *pent;
FILE *fd;

//Tämä looppi käy läpi yhden tiedoston kerrallaan
while(pent=readdir(pdir))
{
tiedostonimi = pent->d_name;

if(!strcmp(tiedostonimi, ".") ||!strcmp(tiedostonimi, ".."))
{
continue;
}
//open files
printf("%s\n",tiedostonimi);

tiedostonimi = *argv;
fd = fopen(tiedostonimi, "r");
perror("open");
fclose(fd);
return;
}
}

Äänestä
  • Jospa poistaisit tiedostonimi = *argv; rivin.
    Sillähän sä NIMENOMAAN kerrot haluavasi avata ohjelman argumentiksi annetun tiedoston.

    Äänestä

Postaan nyt esimerkin jotta saadaan vähän selvyyttä.


/* HUOM! Tämä esimerkki ei pysty kesittelemään alikansioita. */
#include
#include
#include
#include
#include

int main(int argc, char *argv[])
{
char *polku = "/polku/kansioon/";
char tiedostonimi[256];
DIR *pdir = opendir(polku);
struct dirent *pent;
FILE *fd;

//Tämä looppi käy läpi yhden tiedoston kerrallaan
while(pent=readdir(pdir))
{

//fopen vaatii koko polun
strcpy(tiedostonimi, polku);
strcat(tiedostonimi,pent->d_name);

//Poista ei halutut tiedostot ja kansiot
if(!strcmp(pent->d_name,".") || !strcmp(pent->d_name,"..") )
continue;

//Tulosta käsiteltävän tiedoston nimi
printf("%s\n",tiedostonimi);

//Avaa tiedosto ja varmistu ettei virheitä syntynyt
fd = fopen(tiedostonimi, "rb");
if(fd == NULL)
{
printf("Tiedoston %s avaaminen epäonnistui!\n",tiedostonimi);
continue;
}

//Käsittele tiedostoa tässä

//Sulje tiedosto ja jatka seuraavalla
fclose(fd);

}

return 0;
}

Äänestä

Ketjusta on poistettu 1 sääntöjenvastainen viesti.

Kommentoi aloitusta


ilmoitus kirjoitti:

Tein ohjelman jossa on looppi joka avaa aina yhden kuvan kerrallaan kansiosta ja prosessoi sen.

Virheilmoituksen näyttäjänä laitoin perror("fopen"); joka ilmoittaa loopin ensimmäisen kuvan aukeavan hyvin kun seuraavissa kuvissa tulee "open success" tilalla "illegal seek".
Mistähän tämä johtuu ja miten sais loputkin kuvat aukeamaan kunnolla?

toinen ongelma:
Looppi ottaa mukaan ja prosessoi "." ja ".." ovatko sitten kansioita ja miten ne sais ohitettua?

Anonyymi
5000

Ilmoita asiaton sisältö

  • Sisältää materiaalia, joka on loukkaavaa, herjaavaa, rasistista, uhkailevaa tai ahdistelevaa.

  • Materiaali sisältää nimiä, yhteystietoja tai muita henkilökohtaisia tietoja. Julkisuuden henkilöistä, julkisissa viroissa toimivista ihmisistä sekä yritysten vastuuhenkilöistä saa keskustella työhön liittyen. Myös yksityiselämään liittyvistä asioista voi keskustella siltä osin, kuin niistä on julkisesti kerrottu.

  • Sisältää lapsille haitallista tai heiltä kiellettyä materiaalia. Seksuaalinen sisältö on sallittua aiheeseen tarkoitetuilla palstoilla, joiden ikäraja on 18 vuotta.

  • Lainvastaista sisältöä voi olla mm. yksityiselämää loukkaavan tiedon levitys, kiihottaminen kansanryhmää vastaan, laiton uhkaaminen, alaikäisiin liittyvä seksuaalinen sisältö/grooming, petokset, identiteettivarkaudet, kunnianloukkaukset ja tekijänoikeusrikkomukset.

  • Sisältö ei liity palstan tai keskusteluketjun aiheeseen.

  • Viesti ei ole suomea tai ruotsia (pl. International Forums), se sisältää mainontaa, se sisältää tekijänoikeuksin suojattua materiaalia, se on massapostitus tai jokin muu syy.

Jaa keskustelu