Scolring - Forum

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.

#1 30-Oct-2011 10:00:56

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,023
Website

[SOLVED] fopen

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

#2 30-Oct-2011 15:09:33

arkeon
Admin. / Scol language & OpenSpace3D developer
From: Nantes
Registered: 30-Mar-2009
Posts: 4,560
Website

Re: [SOLVED] fopen

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

#3 30-Oct-2011 16:13:10

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,023
Website

Re: [SOLVED] fopen

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

#4 30-Oct-2011 16:52:56

arkeon
Admin. / Scol language & OpenSpace3D developer
From: Nantes
Registered: 30-Mar-2009
Posts: 4,560
Website

Re: [SOLVED] fopen

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

#5 30-Oct-2011 17:33:41

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,023
Website

Re: [SOLVED] fopen

#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 smile

PS : ce bout de code  ne vérifie pas grand chose, notamment en entrée et le contenu du fichier à lire ... wink

Offline

#6 30-Oct-2011 17:38:44

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,023
Website

Re: [SOLVED] fopen

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

#7 30-Oct-2011 17:44:37

arkeon
Admin. / Scol language & OpenSpace3D developer
From: Nantes
Registered: 30-Mar-2009
Posts: 4,560
Website

Re: [SOLVED] fopen

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

#8 30-Oct-2011 17:59:50

iri
Admin. / Scol language & Scol apps developer
From: France
Registered: 22-Feb-2009
Posts: 2,023
Website

Re: [SOLVED] fopen

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

Board footer

Powered by FluxBB