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?
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?
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
mistä sen muuten voi tietää, että mikä on vialla?
Yrität lukea sitä edellistä kuvaa vielä tai jotain vastaavaa.
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");
...
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*?
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.
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?
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;
}
}
Jospa poistaisit tiedostonimi = *argv; rivin.
Sillähän sä NIMENOMAAN kerrot haluavasi avata ohjelman argumentiksi annetun tiedoston.
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;
}