Lire fichier ligne par ligne

cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010 - 13 févr. 2004 à 12:53
michelcreve Messages postés 13 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 10 mars 2006 - 15 nov. 2005 à 08:35
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

garslouche Messages postés 583 Date d'inscription mardi 26 novembre 2002 Statut Membre Dernière intervention 29 mai 2015 1
13 févr. 2004 à 13:52
fgets

On ne force pas une curiosité, on l'éveille.
.................................................Daniel Pennac
0
cs_Arnotic Messages postés 933 Date d'inscription dimanche 1 avril 2001 Statut Membre Dernière intervention 9 janvier 2012
13 févr. 2004 à 13:54
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++
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
13 févr. 2004 à 14:08
#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.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
13 févr. 2004 à 16:56
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;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
13 févr. 2004 à 17:02
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.
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
13 févr. 2004 à 17:19
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
0
cs_mat74 Messages postés 241 Date d'inscription dimanche 10 août 2003 Statut Membre Dernière intervention 16 juin 2010
13 févr. 2004 à 17:25
merci a ts
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
13 févr. 2004 à 17:39
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*
0
cs_djl Messages postés 3011 Date d'inscription jeudi 26 septembre 2002 Statut Membre Dernière intervention 27 novembre 2004 7
13 févr. 2004 à 17:42
c'est quoi le prototypr de getline avec type string?
0
Hylvenir Messages postés 364 Date d'inscription mercredi 11 février 2004 Statut Membre Dernière intervention 5 octobre 2006 2
13 févr. 2004 à 17:45
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)
0
dletozeun Messages postés 546 Date d'inscription vendredi 13 février 2004 Statut Membre Dernière intervention 9 janvier 2008 1
16 févr. 2004 à 22:45
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!
0
michelcreve Messages postés 13 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 10 mars 2006
4 oct. 2005 à 09:00
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
//

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

Chevalier Pheno Starboard, membre de la Freeman-Corp
0
michelcreve Messages postés 13 Date d'inscription mardi 1 mars 2005 Statut Membre Dernière intervention 10 mars 2006
15 nov. 2005 à 08:35
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.
0
Rejoignez-nous