Entraides et échanges autour de la technologie Scol - Informations and exchanges on the Scol technology
Vous pouvez changer la langue de l'interface une fois inscrit - You can change the language once registered
You are not logged in.
Pages: 1
Yop
Ce fil fait suite à ce message [en] dans la rubrique Showcase du forum.
Ton lien de définition de fopen renvoie vers msdn. Là, j'ignore totalement si c'est bien la version standard de fopen ou une version "microsoftisée".
Si c'est la fonction standard (C89) et si VC++ intègre correctement la norme du C, fopen t'indiquera l'erreur :
- par un retour NULL
- par un code erreur contenu dans errno. Je crois qu'il y a une fonction genre GetLastError () sous VC++ pour faire le lien.
Ces erreurs sont celles de fopen mais aussi de fonctions "filles" : malloc (allocation en mémoire de la structure FILE), open (ouverture du fichier). Ce n'est donc pas forcèment fopen qui plante mais malloc ou open qui sont appellées de façon transparente. Ces codes sont suffisamment précis pour orienter la recherche.
As-tu testé la variable qui contient ce path) lors de l'appel à fopen ? Contient-elle bien le "bon" path, est-il tronqué, contient un caractère "exotique", etc ?
Offline
j'ai débogué en pas à pas (debug quoi) en vérifiant bien sur les variables, et c'est bien le fopen dans la fonction _storepack qui retourne NULL alors que le même appel dans un script de test avec les même chemins (mais hors cache) passe bien.
sans compter que seul le fait que ces path soient dans le user/appData... et que le dossier commence par des chiffres et contient des "." le fasse foirer ^^^
tous les autres fichiers passent bien dans le même cas
Offline
essaie de voir le code retourné par errno alors :
include <errno.h>
...
FILE *pf;
pf = fopen (filename, flag);
if (pf == NULL) /* error */
{
MMechostr (MSKDEBUG, "fopen error : %d %s\n", errno, strerror (errno));
/* to do somethings */
}
...
Si fopen est bien le fopen standard C, tu peux tester directement errno
http://www.linuxcertif.com/man/3/fopen/ (§ ERREURS)
http://www.linuxcertif.com/man/2/open/ (§ ERREURS)
Offline
bon trouvé d'ou vient le bug
int SPaddfile(packdir p,char *sign,int size,char *path)
{
int typ;
/* nouveau test sur les noms de fichiers dans le cache */
if ((Firstpack==Cachepack)&&(SPtestfilename(sign))) return -1;
je pige pas trop ce que vient faire ce test ici mais en commentant le test ça passe ^^
(j'avais pas vu a 2h du mat que le fichier envoyé a fopen n'avait pas le chemin du cache complet ^^)
Offline
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
#define NBMAXCHAR 5
#define MAXFOLDERCHAR 255
#define FOLDER "C:\\Users\\seven\\AppData\\Local\\Scol Voyager\\Cache\\"
void write_a_file_to_user_doc (const char *content, char *filename)
{
char p[MAXFOLDERCHAR+1];
FILE *pf;
snprintf (p, MAXFOLDERCHAR, "%s%s", FOLDER, filename);;
pf = fopen (p, "w");
if (pf == NULL)
{
printf ("Open the file : %s %d %s\n", p, errno, strerror (errno));
exit (1);
}
printf ("fopen 2 (w) : ok\n");
printf ("fwrite : %d\n", fwrite (content, sizeof (char), NBMAXCHAR, pf));
fclose (pf);
printf ("finished !\n");
}
void open_a_file_from_user_doc (char *filename, char *outfile)
{
char p[MAXFOLDERCHAR+1];
char content[NBMAXCHAR+1];
FILE *pf;
snprintf (p, MAXFOLDERCHAR, "%s%s", FOLDER, filename);
pf = fopen (p, "r");
if (pf == NULL)
{
printf ("Open the file : %s %d %s\n", p, errno, strerror (errno));
exit (1);
}
printf ("fopen 1 (r) : ok\n");
fread (content, sizeof (char), NBMAXCHAR, pf);
printf ("fread : ok\n");
fclose (pf);
write_a_file_to_user_doc (content, outfile);
}
int main (int argc, char**argv)
{
printf ("Hello !\n");
if (argc != 3)
{
printf ("Two arguments required\n");
exit (1);
}
printf ("in = %s\n", argv[1]);
printf ("out = %s\n", argv[2]);
printf ("folder = %s\n", FOLDER);
open_a_file_from_user_doc (argv[1], argv[2]);
exit (0);
}
en compilant avec gcc :
gcc -pedantic -ansi -o c:\users\seven\documents\test_fopen.exe c:\users\s
even\documents\test_fopen.c
on obtient quelque chose de correct dans ce dossier cache :
C:\Users\seven\Documents>test_fopen.exe 01.23.test.in.txt 01.23.test.out.txt
Hello !
in = 01.23.test.in.txt
out = 01.23.test.out.txt
folder = C:\Users\seven\AppData\Local\Scol Voyager\Cache\
fopen 1 (r) : ok
fread : ok
fopen 2 (w) : ok
fwrite : 5
finished !
fopen fonctionne parfaitement
PS : ce bout de code ne vérifie pas grand chose, notamment en entrée et le contenu du fichier à lire ...
Offline
Arf ! Je me doutais que fopen était hors de cause mais qu'il devait y avoir une erreur en amont quelque part !
Ceci dit, ce test doit avoir une signification, si j'étais toi je regarderais le code de SPtestfilename et, par là, les fonctions de hashage dans la VM
Offline
difficile a dire, de toutes façons le test est faux depuis windows 95 on peux maintenant mettre tout ce que l'on veux dans les noms de fichiers et dossiers
j'ai donc changé :
int SPisname(int c, int l)
{
//$BB replace test by non allowed characters
if ((c=='*')||(c=='?')||(c=='"')||(c=='<')||(c=='>')||(c=='|')) return 0;
if ((c=='/')||(c=='\\')) return 0;
return 1;
}
et donc commenté dans SPaddfile
//$BB remove test. now the directories names can contain special char too
//if ((Firstpack==Cachepack)&&(SPtestfilename(sign))) return -1;
Offline
Effectivement, j'étais en train de regarder cette fonction et je me disais qu'elle ne servait plus à grand chose !
De plus, elle n'utilise pas les fonctions de hashage qui se font ailleurs.
Offline
Pages: 1