CommentCaMarche
Recherche
Posez votre question Signaler

Lire un fichier en C

Laura - Dernière réponse le 8 juin 2012 à 19:28
Bonjour a tous,
Je suis en train de faire un petit programme qui lit un fichier "FILES", dont il y a un nombre entier qui represente le nombres de fichier a lire, et les noms des fichiers qu"il faut lire.
Par exemple FILES peut contenir 1G, donc ici on a un fichier a lire, et le fichier säppelle G.
Je stock ces deux variables dans FileNum(pour le nombre de fichier), et je stock le nom du fichier dans le pointeur *fich.
Lee programme compile bien.
Laa valeur de fich, lorsque je l"imprime esst bien G.
Mais a la fin du programme lorsque je demande d"ouvrir le fichier jäi le message d"erreur : Le fichier ne veut pas s"ouvrire !
Je demande a tout ceux qui peuvent de l"aide.
Merci

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

FILE *fptrNO,*File;
int FileNum,i,j,k;
char *fich;

int main()
{
if((fptrNO=fopen("FILES","r"))==NULL) { printf("Le fichier FILES ne veut pas s"ouvrire! \n"); exit(1);}

/* on va lire le fichier ligne par ligne et executer le programme a chaque fois */

fscanf(fptrNO,"%d",&FileNum);

for (i=1;i<=FileNum;i++)
{
fscanf(fptrNO,"%c",&fich);
printf("\n %c\n \n",fich);

if((File=fopen("fich","r"))==NULL) { printf("Le fichier ne veut pas s"ouvrire ! \n"); }

}
return 0;
}
Lire la suite 
Réponse
+5
moins plus
Une belle ratatouille ce code là :-D .
Pour ouvrir convenablement un fichier en lecture seule:

/* Portion de code */

#include <stdio.h>
#include <stdlib.h>

FILE *stream;
stream = fopen("c:\\fichier.txt", "r");
if(stream = NULL)
{
printf("Le fichier n'existe pas");
}
else
{
printf("Le fichier existe et est ouvert en lecture seule");
}
fclose(stream);
rami- 16 févr. 2012 à 21:56
lire caractére par caracte:
Répondre
Polo31- 21 févr. 2012 à 17:24
Moi il y avait une erreur quand je ne mettait pas d'extension.

P.S. : Pour ton code n'inclue que les librairies dont tu a besoin par exemple ici stdio et stdlib suffisent.
Répondre
dream- 21 avril 2012 à 23:48
if(stream == NULL) sinon la condition sera toujours vraie
Répondre
fiddy 10169Messages postés samedi 5 mai 2007Date d'inscription ContributeurStatut 23 février 2015Dernière intervention - 21 avril 2012 à 23:59
Toujours fausse tu veux probablement dire.
Sinon, le sujet remonte à 2003...
Répondre
nonames- 8 juin 2012 à 19:28
if( (stream = fopen("nom_de_mon_Fichier", "r")) == NULL) { // fopen revoie NULL en cas d'erre

printf( " Erreur lors de l'ouverture du Fichier ");
}
else
printf ("Fichier ouvert");
Répondre
Ajouter un commentaire
Réponse
+5
moins plus
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

int main()
{
FILE *fptrNO,*File;
int FileNum,i,j,k;
char *fich;
fptrNO = fopen("files", "r");
if(fptrNO != NULL)
{
fscanf(fptrNO, "%d", &FileNum);
for (i = 1; i < FileNum + 1; i++)
{
fscanf(fptrNO,"%c",&fich);
printf("\n %c\n \n",fich);
File = fopen("fich","r");
if(File != NULL)
{
/* instructions */
}
}
}
fclose(fptrNO);
return EXIT_SUCCESS;
}

Un 1er jet pour ouvrir les fichiers.
Laura- 13 nov. 2003 à 11:34
Excuse mon code, et merci beaucoup pour ton aide
mais en fait ce que je veux faire, cést lire un fichier qui contient des noms dee plusieurs fichiers.
ensuite je veux ouvrir ces fichiers unne aa une pour les lires.
Cést pour cette raison que je definis un fileNum c"est lle nombre de fichier que je dois lire.
Donc j"ai fait un petit essai ,j"arrivve bien a lire le ppremier fichier ou il y a le nom de fichier que jje dois consuleter, mais une fois que je vous ouvrir ce fichier ca nne marchhe plus.

Je vais essayer ton code
Répondre
Ajouter un commentaire
Réponse
+3
moins plus
J'ai oublié de dire que tes variable déclaré hors bloc sont globales et c'est à éviter quand ce n'est pas nécessaire car ça consomme de la mémoire inutilement, du moins trop longtemps.
Ajouter un commentaire
Réponse
+2
moins plus
bonjour
déjà, pour repondre a la demoiselle qui pose sa question sur l'ouverture, la lecture propre sequentielle mode texte formatté d'un simple file, je suis sur qu'elle peut trouver toute seule en respectant certes, comme elle dis ' c du joli code ca',une certaine discipline de programmation parce que en c, surtout le c_ansi, il neput pas y avoir de l'a peu pres, c du pointu, c tout.

Donc, par ex, quand je lis et comprends ( à moitié bien sûr etant donné que le programme est comprehensible seulement par rapport à son degré de discipline de developpement par rapport au standart ansi_c...) la valeur de retour de la fonction main avec return EXIT_SUCCESS, ben laissez moi vs dire que la, c deja pas du propre car il aurait aussi fallut declarer la vraie definition de la fonction main, meme si ns travaillons pas en environnement de shell commande, d'invite de commande si vs preferez ( int argc, char*argv[], char*enp[])+ le fichier en tête correspondant et contenant la definition de la fonction renvoyant ce genre de code de retour pour main à l'environnement OS.
Ceci etant dis,
revenons dans le sujet posté par cette demoiselle:
LIRE UN FICHIER QUI CONTIENT DES AUTRES NOMS DE FICHIERS??

Ben , déjà, ton fichier contenant ces fameux autres noms doit préalablement exister.
ensuite, tout depend du mode avec lequel tu accèdes à ces fichiers, comprends tu??
il fo trop bien differencier le mode texte du mode binaire

A MON AVIS, celui qui es dans le vrai pour le moment, c BOB
c le seul qui approche le c propre et dans les règles.
ton code du debut mademoiselle et ce que l'on appelle, du spaghettos ou spaghettis si tu es italienne lol

Si par exemple, tu as specifié un numero de fichier correspodant à un fichier se trouvant dans le fichier contenant tous les autres fichiers auxquels tu desires acceder comm bon te sembles, et que, le fichier selectionner n'est qu'un fichier binaire, c'est à dire, non formatté, genre un executable, un classeur excel, une base de données access, là il te faudra reflechir car ce n'est pas aussi simple que tu le penses.

Avec le mode binaire du c_ansi, tu pourras lire et ecrire dans les streams comme bon te sembles, mais, tout ce que tu auras à l'ecran, ce sera le courant binaire tel qu'il aura ete copier et lu dans un buffer avec fread et fwrite.
avec du mode texte, avec fgetc, fputc pour lire et ecrire caractere /caractere, avec fgets et fputs, "" lignes / lignes, et un autre acces special , l'aleatoire, qui fonctionne avec les enregistrements mais en mode binaire,tu auras à l'ecran pour un simple file en texte formatté exactement ce que tu auras lu ou ecrits, par contre, avec les executables, cela va te surprendre , tu n'auras qu'à essayer.
TON PROBLEME C QUE TU AS PAS COMPRIS COMMENT FONCTIONNE LE LANGAGE DE PROGRAMMATION C, qui en apparence,n je vs l'accorde est simple, mais, qui dans les details, ne peut etre compris que par les plus ferus, ca c clair


bonne chances
abdel
Ajouter un commentaire
Réponse
+2
moins plus
Bonsoir,
(a Tilteur et Ahmed, il vaudrait mieux ouvrir un nouveau thread .)

Laura,

voici ton code un peu corrigé, je l'ai compilé et il fonctionne sans problème chez moi. J'ai créé un fichier FILES contenant 1G et un fichier G (vide) pour le tester:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>

FILE *fptrNO,*File;
int FileNum,i,j,k;
char fich [2]; //<--correction

int main() {
if((fptrNO=fopen(
Ajouter un commentaire
Réponse
+0
moins plus
#include <stdio.h>
#include <stdlib.h>

FILE *fptrNO;
fptrNO = fopen("files", "r"); // "files" doit être dans le répertoire local à l'application

A partir de la le fichier peut être ouvert si il existe et que l'adresse est correcte maisdans le cas contraire tu auras un bug donc c'est pour ça que l'on met un "if()" pour vérifier que le fichier peut être ouvert sinon on ne réalise aucune opération sur ce fichier qui n'existe pas.
Ajouter un commentaire
Réponse
+0
moins plus
Sans oublier de faire:

fclose(fptr); // libère le pointeur de flux de données
Laura- 13 nov. 2003 à 11:10
Merci pour tes reponses.
le fichier que je veux ouvrir esst bien dans lle repertoire courant mais le message d"erreur revient.
Il ne reconnaitt pas le fichier.
Je pense que ca vient du fait, que je pointe sur lle nom du fichier que je saisi danss le fichier FILES avec le pointeur fich...mais quand j"essai d"ouvrir fich Ca ne marche pas.
Et je ne saiss pas comment resoudre cec probleme .
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
Bon laisse moi 5' je vais réarranger ce code et tu me diras si cela te convient.
Ajouter un commentaire
Réponse
+0
moins plus
Et ben bon dieu faut décortiquer ce que souhaitais faire parce que la logique du code je la cherche toujours ;-) .
Laura- 13 nov. 2003 à 11:31
Excuse mon code, et merci pour ton aide
mais en fait ce que je veux faire, cést lire un fichier qui contient des noms dee plusieurs fichiers.
ensuite je veux ouvrir ces fichiers unne aa une pour les lires.
Cést pour cette raison que je definis un fileNum c"est lle nombre de fichier que je dois lire.
Donc j"ai fait un petit essai ,j"arrivve bien a lire le ppremier fichier ou il y a le nom de fichier que jje dois consuleter, mais une fois que je vous ouvrir ce fichier ca nne marchhe plus.
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
C'est possible d'avoir le contenu du fichier "files" pour voir la tête que ça? ou un exemple pour voir l'organisation.
enitbasma- 25 juin 2008 à 17:23
salut

je ne sais pas si vous rappelez encore de C.

mais bon j'ai mets dans un fichier un ensemble de requetes dont je veux executer par une fonction qui s'appeler usqlexec dans ca pour tester la rupestesse du serveur

dc je dois ouvrir le fichier (ca je le connais) et le parcourir ligne par ligne et à chaque ligne il fait appel à la fonction

je ne sais pas si vous pouvez m'aider.

voici la partie que je veux la transformer

void *thread1()
{
char query[512];
static int test_id=1;
int reccount=0,i;
int ErrCode;
uSQLCdb *udb;


udb=uSQLCopen(user,passn,server,3002,5000,&ErrCode);
if(udb)
{


while(test_id<=3)
{

switch(test_id)
{
case 1: {printf("thread A : premier test:: select * from test whedddre foo='baa'\n\r");
strcpy(query,"select * from test");
}
break;
case 2: {printf("thread A : deuxieme test:: insert into test values ('bloooo')\n\r");
strcpy(query, "insert into test values ('blaaaaa')");}
break;
case 3: {printf("thread A : troisieme test:: update test set foo='ffffff' where foo='jjjj'\n\r");
strcpy(query, "update test set foo='hhhhhh' ");}
break;
default:
break;
}

printf("Thread A:test_id :%d\n\r",test_id);
for (i=0; i<5; i++)
{
printf("la requête du thread A numero %d\n\r",i);
ErrCode=uSQLCexec(udb,(char *)query,dcallback1,NULL,ecallback1);
printf("\n thread A: Connected with User Level %i\n",udb->seclevel);
//fprintf(stderr,"\nThread A Error %i : %i Records\n",ErrCode,reccount);
if(test_id == 2 || test_id == 3)
i = 5;
}
test_id ++;
}
}
else
{
fprintf(stderr,"\n\nThread A can not establish connection with the server. Error code:%i\n\n",ErrCode);
}
uSQLCclose(udb);
fclose(fich);
return NULL;
}
//////////////////////////////////////////////////////////////////////////////////////////////////


je l'ai transformer comme ci mais je ne sais pas quoi faire apres pour parcourir le fichier


void *thread1()
{ FILE * fich;
char query[512];
static int test_id=1;
int reccount=0,i;
int ErrCode;
uSQLCdb *udb;
fich = fopen("/home/stagiaire/workspace/USqlite/install/var/files/threadA",r);
if(!fich) erreur;
udb=uSQLCopen(user,passn,server,3002,5000,&ErrCode);
if(udb)
{
while(!foef(fich))
{ fscanf (FILE * fich);

// while(test_id<=3)
// {
//
// switch(test_id)
// {
// case 1: {printf("thread A : premier test:: select * from test whedddre foo='baa'\n\r");
// strcpy(query,"select * from test");
// }
// break;
// case 2: {printf("thread A : deuxieme test:: insert into test values ('bloooo')\n\r");
// strcpy(query, "insert into test values ('blaaaaa')");}
// break;
// case 3: {printf("thread A : troisieme test:: update test set foo='ffffff' where foo='jjjj'\n\r");
// strcpy(query, "update test set foo='hhhhhh' ");}
// break;
// default:
// break;
// }

printf("Thread A:test_id :%d\n\r",test_id);
for (i=0; i<5; i++)
{ ///////////////////executer query////////////////////////
printf("la requête du thread A numero %d\n\r",i);
ErrCode=uSQLCexec(udb,(char *)query,dcallback1,NULL,ecallback1);
printf("\n thread A: Connected with User Level %i\n",udb->seclevel);
//fprintf(stderr,"\nThread A Error %i : %i Records\n",ErrCode,reccount);
if(test_id == 2 || test_id == 3)
i = 5;
}
test_id ++;
}
}
else
{
fprintf(stderr,"\n\nThread A can not establish connection with the server. Error code:%i\n\n",ErrCode);
}
uSQLCclose(udb);
fclose(fich);
return NULL;
}

/////////////////////////////////////////////////

merci de me repondre


je suis tres besoin de votre aide car je suis coincé
Répondre
Ajouter un commentaire
Réponse
+0
moins plus
excuse moi j"ai du me deconnecter pour quelque temps.
un exemple tout simple du contenu du fichier FILES est 1G avec 1 le nombre de fichier a lire, et G le nom du fichier a lire.
G est un fichier qui contient un texte.
Merci
Ajouter un commentaire
Réponse
+0
moins plus
Si tu mets ton fichier dans une chaine de caractère par "fread()" tu pourras par la suite la traiter pour tirer les informations qui t'intéressent. Par exemple si le 1er caractère de la chaine est un chiffre alors tu le copie dans un tableau etc jusqu"à extraire le nombre désiré. L'avantage de traiter le fichier par une chaine de caractère c'est d'avoir la facilité de traitement et par la même occasion éviter l'acces au disque dur ("fseek()", "fsetpos()" déplacent la tête de lecture/écriture) qui est plus coûteux en temps que le traitement en mémoire vive.
Ajouter un commentaire
Réponse
+0
moins plus
Salut tout le monde
est ce ke vous savez commen on fé pour lire un fichier en vb svp.
merci d'avance
Ajouter un commentaire
Réponse
+0
moins plus
Avec Visual Basic :)

Ne prend pas ton temps car le temps ne t'attend pas.
Ajouter un commentaire
Réponse
+0
moins plus
je cherche une définition du fichier inclus en C et une comparaison entre le pascal et le langage c
Ajouter un commentaire
Réponse
+0
moins plus
ql est intéret des overlay ds le langage pascal et est ce ils existe ds le langage C
Ajouter un commentaire
Réponse
+0
moins plus
Salut Laura, je sais que beaucoup de temps est passé mais comme j'étudie pour mon examen de C, j'ai découvert ta faute, cella que personne n'a vue. Tout est correct (à part ta technique de programmation confuse) mais le problème principal c'est que tu as mis FICH entre guillemets; alors, il le prend pour un littéral, ce qui fait que la valeur que tu as lue dans ton fichier (G) qui est en fait le nom du fichier que tu désirais ouvrir n'est pas prise en compte.

JE pense que c'est ça et après tout s'est emmelé dans la discussion.. pas facile d'être compris.
J'ai pas testé mais c'est à vvue d'oeil.
Si je me trompe ignorez ce message.

Ciao!
Ajouter un commentaire
Réponse
+0
moins plus
peut etre ta oublié l'extension des fichiers à lire(.txt)
Ajouter un commentaire
Réponse
+0
moins plus
salut tou monde
comment peut on traiter un fichier xml en c
Ajouter un commentaire
Ce document intitulé «  Lire un fichier en C  » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes.

Le fait d'être membre vous permet d'avoir des options supplémentaires.