Bonjour,

Je développe actuellement un programme de coloriage (voir http://developpez.net/forums/showthread.php?t=267010).

J'ai fait quelques test pour voir un peu les performances sur de plus gros fichiers, afin d'optimiser mon programme. Et lors de la lecture d'un fichier plus gros, je dois attendre très très longtemps (plusieurs minutes voir plusieurs dizaines de minutes selon la taille du fichier (1 Mo/8 Mo)).

Je sais bien que c'est plutôt rare ou même inexistant des codes en C de plusieurs Mo, mais mon soucis et d'avoir pour de prochains programmes, des fonctions de lecture efficaces (puisque ma fonction d'écriture a déjà de bonnes performances).

Voila ce que j'utilise (je tiens à utiliser uniquement des fichiers d'en-tête standards pour la portabilité du code) :

Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
 
#include <stdlib.h>
#include <string.h>
 
[...]
 
// pour l'assemblage des chaines de caractères
char *str_cat (char *str1, char const *str2)
{
	if ((str1 == NULL) && (str2 == NULL))
		return NULL;
	if (str1 == NULL)
		return strdup (str2);
	if (str2 == NULL)
		return str1;
 
	char *strCat = NULL;
	size_t len1;
	if (str1 == NULL)
		len1 = 0;
	else
		len1 = strlen (str1);
 
	void *tmp = realloc (str1, len1 + strlen (str2) + 1);
 
	if (tmp != NULL)
	{
		strCat = tmp;
		if (str1 == NULL)
		{
			strcpy (strCat, "");
		}
		strcat (strCat, str2);
	}
	else
	{
		free (strCat), strCat = NULL;
	}
 
	return strCat;
}
 
// et la fonction de lecture du fichier...
char *readFromFile (const char *path)
{
	char *cData = NULL;
	FILE *fichier = fopen (path, "r");
 
	if (fichier != NULL)
	{
		char chaine[BUFSIZ];
		unsigned long lines = 0;
		while (fgets (chaine, sizeof chaine, fichier) != NULL)
		{
			cData = str_cat (cData, chaine);
			if (cData == NULL)
			{
				puts ("Erreur de memoire");
				break;
			}
			lines++;
		}
		fclose (fichier);
	}
 
	return cData;
}

Merci d'avance et bon développement à tous