romainbisson
Messages postés88Date d'inscriptionjeudi 25 octobre 2007StatutMembreDernière intervention 9 septembre 2014
-
1 avril 2008 à 16:34
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 2009
-
2 avril 2008 à 00:01
Bonjour,
je voudrais comparer une chaine de caractere avec le caractere \n, si ils sont identitiques cela m'incremente un nombre.
char c;
char l ='\n';
char nf[101];
FILE * f;
while((f fopen(nf, "r")) NULL){
printf("\n Veuillez rentrer un nom de fichier correct avec l'extension .txt !\n");
printf("\n Nom du fichier : ");
scanf("%100s", nf);
}
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 1 avril 2008 à 17:14
Bonjour,
Si c'est pour compter un caractère particulier comme '\n' dans le fichier (l'explication est pas très claire !) voilà ce que ça peut donner :
#include <stdio.h>
void main()
{
char car;
char l = '\n';
char nf[MAX_PATH];
int compteur;
FILE *f;
while(true)
{
printf("\n Veuillez rentrer un nom de fichier correct avec l'extension .txt !\n");
printf("\n Nom du fichier : ");
scanf("%s",nf);
f = fopen(nf,"r");
if (f) break; // OK
printf("\n *** ERREUR A L'OUVERTURE DU FICHIER ***\n");
}
romainbisson
Messages postés88Date d'inscriptionjeudi 25 octobre 2007StatutMembreDernière intervention 9 septembre 2014 1 avril 2008 à 19:25
avec le programme au dessous, on a recupere le nombre de ligne du fichier, on sait maintenant combien de fgets a creer, il faudrai que je cree une boucle qui cree autant de fgets que de nombre de ligne.
un truc comme sa,
for(i=0 ; i<nbre_de_ligne ; i++){
fgets(test[i] , 10000, f);
}
et ensuite, je souhaite pouvoir afficher ses lignes, encore avec une bouvle de la derniere a la premier ligne
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 1 avril 2008 à 20:24
Voilà un exemple de lecture à l'envers d'un fichier texte en passant par un tableau dans lequel on mémorise l'adresse de chaque ligne dans le fichier lors d'une première lecture du fichier. Puis, lors de la seconde lecture du fichier, on se positionne sur le début de chaque ligne pour la lire mais en commençant par la dernière ligne et en remontant vers la première ligne.
#include <stdio.h>
#include <time.h>
void main()
{
char nom_fichier[MAX_PATH];
char buffer[1000];
long adresse[10000];
int compteur;
FILE *pf;
// --- Saisir/ouvrir le fichier
while(true)
{
printf("\nVeuillez saisir un nom de fichier correct avec l'extension .txt !\n");
printf("\nNom du fichier : ");
scanf("%s",nom_fichier);
pf = fopen(nom_fichier,"r");
if (pf) break;
printf("\n*** ERREUR A L'OUVERTURE DU FICHIER ***\n");
}
// --- Remplir le tableau des adresses de début de ligne dans le fichier
compteur = 0;
adresse[compteur++] = 0; // 1ère ligne
while (fgets(buffer,sizeof(buffer),pf))
adresse[compteur++] = ftell(pf);
--compteur; // supprimer la dernière ligne = EOF
// --- Parcourir le fichier de la fin vers le début
printf("compteur = %d\n",compteur);
for (int i=compteur-1 ; i>=0 ; --i)
{
fseek(pf,adresse[i],SEEK_SET); // positionnement
fgets(buffer,sizeof(buffer),pf); // lecture
printf("%03d : %s",i,buffer); // visu
}
cs_jfrancois
Messages postés482Date d'inscriptionvendredi 26 août 2005StatutMembreDernière intervention 5 décembre 20092 1 avril 2008 à 22:42
Oui mais à condition de lire tout le fichier puisque'il faut l'afficher (ou le traiter) à partir de la fin.
- Récupérer la taille du fichier
- Allouer un bloc de mémoire de la taille du fichier
- Lire le fichier d'un coup dans ce bloc
- Rechercher et afficher/traiter les lignes à partir de la fin du bloc
- Désallouer le bloc
SAKingdom
Messages postés3212Date d'inscriptionlundi 7 novembre 2005StatutMembreDernière intervention16 février 200915 2 avril 2008 à 00:01
Ah ok je vois.
"- Récupérer la taille du fichier
- Allouer un bloc de mémoire de la taille du fichier
- Lire le fichier d'un coup dans ce bloc
- Rechercher et afficher/traiter les lignes à partir de la fin du bloc
- Désallouer le bloc"
Y'a moyen de s'arranger autrement mais ce sera, dans la plupart des cas, un vrai gaspillage de CPU.