Lire fichier ligne par ligne

Signaler
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010
-
Messages postés
13
Date d'inscription
mardi 1 mars 2005
Statut
Membre
Dernière intervention
10 mars 2006
-
salut a ts

je voudrai savoir comment je pourrai lire un fichier lignes par lignes . par exemple une fonction qui me permerttrai de recuperer la ligne 3 ds une chaine .

j'utilise VC++ 6.0 , et la library fstream .

merci d'avance

@+
A voir également:

14 réponses

Messages postés
584
Date d'inscription
mardi 26 novembre 2002
Statut
Membre
Dernière intervention
29 mai 2015

fgets

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
Messages postés
933
Date d'inscription
dimanche 1 avril 2001
Statut
Modérateur
Dernière intervention
9 janvier 2012
1
Bonjour,

Il faut lire ton fichier caractère par caractère et voir quand tu les caractère CR et LF dans ce cas tu peux déterminer que les octects précédents ces caractères faisaient partis d'une ligne.

@+
Arnotic
Admin CS, MVP Visual C++
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
#include <fstream>
#include
using namespace std;

int main(int, char*[] )
{
ifstream file( "fichier.txt" );

string line;
while( getline( file, line ) )
cout << line << endl;
}

J'ai pas compilé mais c'est l'idée.
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
tout a fait, voici la version compilable ;)

#include <fstream>
#include

using namespace std;

int main()
{

ifstream file;
char line[256];

file.open("fichier.txt",ios::in);

while( file.getline(line,sizeof line) )
cout << line << endl;
}
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
En fait, l'autre version doit être compilable aussi
au #include <string> près peut être pour certains
compilateurs.

E meilleur car pas de limite de buffer pour le getline.
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
oui, mais moi je veux bien avoir une version qui compile avec vc++ 6

sinon avec char* tu alloue en fonction de la taille de chaque ligne
Messages postés
241
Date d'inscription
dimanche 10 août 2003
Statut
Membre
Dernière intervention
16 juin 2010

merci a ts
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
Désolé, je n'ai pas ce compilateur. Je ne le connais que
de réputation. Mais tu dois pouvoir éviter la lecture par char*
Messages postés
3011
Date d'inscription
jeudi 26 septembre 2002
Statut
Membre
Dernière intervention
27 novembre 2004
7
c'est quoi le prototypr de getline avec type string?
Messages postés
364
Date d'inscription
mercredi 11 février 2004
Statut
Membre
Dernière intervention
5 octobre 2006
2
J'suis pas sûr que ça aide...
mais c'est dans normalement.

template<class _CharT, class _Traits, class _Allocator>
inline basic_istream<_CharT, _Traits>&
getline (basic_istream<_CharT, _Traits>& __is,
basic_string<_CharT, _Traits, _Allocator>& __str)
Messages postés
546
Date d'inscription
vendredi 13 février 2004
Statut
Membre
Dernière intervention
9 janvier 2008

une facon de lire un fichier ligne par ligne:

char chaine[256];
fscanf(pointeur sur fichier,"%[^\n]\n",chaine);

fscanf va lire le fichier et le copier dans chaine jusqu'a ce quelle rencontre la fin de la ligne!

voila si ca peux t'aider!
Messages postés
13
Date d'inscription
mardi 1 mars 2005
Statut
Membre
Dernière intervention
10 mars 2006

Salut, c'est michel,

Jete un oeil sur mon programme ci dessous, qui pourra peut être t'aider.

J'essai de faire un Utilitaire de reformatage d'un fichier lu en entrée et création d'un autre fichier en sortie.
- Le programme demande le chemin daccès du fichier en entrée
la longueur des enregistrements en sortie
et éventuellement si on veut tronquer ou faire un retour a la ligne

Reste un problème que j'ai, c'est que lorsque je lis des fichiers en provenance de Windows NT, toutes les caractères 'é' 'è' 'à', unicode etc.. sont ignorés et ne sont pas repris alors que les fichiers venant de XP c'est OK ??.

Je pense que le problème se situe dans le code recopié cidessous (en rouge):
Il faut surement utiliser autre code, mais lequel ?
FileStream* fw = new FileStream(path, FileMode::Open);
StreamReader* sr = new StreamReader(fw);

Si de ton coté tu as eu l'info pour ouvrir ton fichier, ce serait sympas de me donner le tuyau.

Michel (le mari de la belle cicilienne)


Voici mon source :
// This is the main project file for VC++ application project
// generated using an Application Wizard.

#include "stdafx.h"

#using <mscorlib.dll>

using namespace System;
using namespace System::IO;
using namespace System::Text;


#include <valarray>
#include <Cstring>
#include

#include
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
// This is the entry point for this application
#ifdef _UNICODE
int wmain(int argc, wchar_t *argv[], wchar_t *envp[] )
//int wmain(void)
#else
int main(int argc, char* argv[])
#endif

{
using namespace std;
String* path = new String(argv[1]);
int longueur = 0;

string line2 ("");
char respons = ' ' ;

//Console::Write("Valeur de argc = ");
//Console::WriteLine(argc);
//Console::WriteLine(argv[1]);
//Console::WriteLine(argv[2]);

if (argc < 2) // Verifie si on a passé le 1er parametre
{
Console::WriteLine(S" ----------------------------------------------");
Console::WriteLine(S" Veuillez entrer le chemin et nom de fichier : ");
Console::WriteLine(S" ----------------------------------------------");
path = Console::ReadLine();
}
if (argc == 3) // Verifie si on a passé le 2eme parametre
{longueur = atoi(argv[2]);
}
if (longueur == 0) // Verifie si on a passé la longueur
{
Console::WriteLine(S" ----------------------------------------------------");
Console::WriteLine(S" Veuillez entrer la longueur de chaque record desiré ");
Console::WriteLine(S" ----------------------------------------------------");
longueur = Console::ReadLine()->ToInt16(0);

}
if (!File::Exists(path)) // Verifie si le fichier existe
{
Console::WriteLine(S" --------------------------------------");
Console::WriteLine(S" Fichier ou chemin d'accès incorrect ! ");
Console::WriteLine(S" --------------------------------------");
Console::WriteLine(path);
Console::WriteLine(S" --------------------------------------");
cin.ignore();
return -1;
}
try
{
// Create a FileStream
String* path2 = S"D:\\data\\MyTest2.out";
//FileStream* fs = new FileStream("d:\\data\\output.txt", FileMode::Create);
// Create a StreamWriter
StreamWriter* sw = new StreamWriter(path2, false, new UnicodeEncoding());
//StreamWriter* sw = new StreamWriter(fs); topé 09sept

FileStream* fw = new FileStream(path, FileMode::Open);
StreamReader* sr = new StreamReader(fw);
int count = 0;

Console::WriteLine(S" --------------------------------------");
Console::Write(S"longueur d'enregistrement demandé : ");
Console::WriteLine(longueur);
Console::WriteLine(S" --------------------------------------");

for(;;) // Lecture des enregistrements
//-----------------------------------------------
{
String* line = sr->ReadLine();
count++;

// If there are no more lines, break out of the loop
if (line == 0) break;

if (longueur > 0 )
{
//test si l'enregistrement > a la taille demandée
//-----------------------------------------------

if (line->get_Length() < longueur )
{ if (line->get_Length() 1 && toascii(line->ToChar(0)) 26) break; // si fin de fichier
//Console::Write("enreg < longueur : ");
//Console::WriteLine(toascii(line->ToChar(0)));
//Console::WriteLine(line); //Affiche a l'écran
line2.resize(longueur-(line->get_Length()) ,'0'); //complete la ligne avec des zéro
sw->Write(line);
sw->WriteLine(line2.data());
}
else
{ if (respons == ' ')
{
Console::WriteLine(S"--------------------------------------------------------");
Console::WriteLine(S"Longueur d'enregistrement detecte > à taille demandé ? ");
Console::WriteLine(S"Voulez vous ajouter le surplus à la ligne suivante (O/N)");
Console::WriteLine(S" -------------------------------------------------------");
String* response = Console::ReadLine();
respons = response->ToChar(0) ;
}
if (respons 'O' || respons 'o')
{ do
{ sw->WriteLine(line->Substring(0,longueur));
line = line->Substring(longueur);
}
while (line->get_Length() >= longueur);
if (line->get_Length() > 0)
{ line2.resize(longueur-(line->get_Length()) ,' ');
sw->Write(line);
sw->WriteLine(line2.data());
}
}
else
{
sw->WriteLine(line->Substring(0,longueur));
}
}
//-----------------------------------------------

}
//-----------------------------------------------

else
{
sw->WriteLine(line);
}
//if (count % 20 == 0) // Pause toutes les 20 lignes
//{
// Console::Write("--more--");
// String* response = Console::ReadLine();
// if (response->Equals(S"q")) break;
// count = 0;
//}
} //fin FOR


sw->Flush();
sw->Close();
}
catch(System::Exception* pe)
{
Console::WriteLine(pe->ToString());
}

//cin.ignore();
return 0;
}

------------------------------

Voici le Fichier header stdafx.h (contenant que du commentaire)

// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

--------------------------------
Messages postés
141
Date d'inscription
mardi 30 avril 2002
Statut
Membre
Dernière intervention
23 mars 2005
1
merci pour cette réponse pertinente !!
PS : faut lire quelle ligne ???

Chevalier Pheno Starboard, membre de la Freeman-Corp
Messages postés
13
Date d'inscription
mardi 1 mars 2005
Statut
Membre
Dernière intervention
10 mars 2006

C'était pour lire toutes les lignes d'un fichier pour les reformater autrement.
sinon, pour permettre de lire les enregistrements contenant des accents 'é' 'è' 'à' etc.. j'ai enfin trouvé la solution (après beaucoup de recherche) voici le code :
FileStream* fw = new FileStream(path, FileMode::Open);
StreamReader* sr = new StreamReader(fw, Encoding::UTF7, true);

Il fallait tout simplement ajouter Encoding:: avec UTF7 (pour mon cas)
valeurs possibles : ASCII, Unicode, UTF7 et UTF8

Après avoir trouvé la solution, j'ai donc amélioré mon programme pour rectifier certains bugs.
Si ca vous interresse d'avoir la dernière version, faites le moi savoir.
Michel.