Lire/ecrire fichier texte a plusieurs colonnes

cs_denini Messages postés 10 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 28 février 2003 - 27 févr. 2003 à 21:11
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019 - 3 mars 2003 à 11:47
voilà, j'aimerais ecrire et lire sur un fichier texte
Je voudrais stocker une date, une valeur et un nb
et ce pour N clients.

Je voudrais que le fichier texte se présente comme ceci

Action A Action B
------------------ ------------------
01/03/02 200 4 01/04/03 300 5 //N*3 colonnes
04/03/02 300 4 04/03/05 200 4

00/00/00 00 0//si plus dinfo pour laction

EX:

01/03/02 200 4 01/04/03 300 5 //N*3 colonnes
04/03/02 300 4 04/03/05 200 4
00/00/00 0 0 05/03/05 100 5
00/00/00 0 0 00/00/00 0 0//fini

En lisant, j'aimerais stocker les valeurs ds des Strings, pour les traiter. Qq peut til mexpliquer coment stocker les valeurs, comment dire que je veut lire la lignne x. De meme pour ecrire. Et me fournir le code j'en serais très heureux.

Merci d'avance.

22 réponses

BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 févr. 2003 à 22:01
alors va voir, j'ai deja fait un truc pour cela dans mes sources.
Quand meme c'est pas bon qu'on ecrive dans notepad car tu ne seras pas sur que donnees sont valide
par exemple 56/18/2003 peut etre entre par erreur. Tu dois faire un prog de saisie avec un calendrier, usager ne doit jamais saisir une date.
ciao...
1
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 févr. 2003 à 21:39
Windows ou non ???
si oui on optimise pour sinon fais avec les flux et les reflux.
ciao...
0
cs_denini Messages postés 10 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 28 février 2003
27 févr. 2003 à 21:41
windows mais je ne cherche pas une super optimisation, je sais quil faut utiliser fstream.h et je vois plus ou moins comment ca va mais la je n'y arrive pas.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 févr. 2003 à 21:45
Si pour Windows, nenni fstream et cie.
Tu es sur de vouloir que ce soit en format texte, c'est plus long que binaire a traiter vu que tu as mis cela dans rubrique database ?
0

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

Posez votre question
cs_denini Messages postés 10 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 28 février 2003
27 févr. 2003 à 21:49
oui un fichier texte, je dois lire et ecrire dessus ce que je lis j'aimerais le stocker ds un string puis le traiter cest la fonction qui lit le fichier et qui stoque qui minteresse. Ce que je ne sais pas faire aussi c demander de lire la ligne 2 par exemple ou alors la 3eme colonnes de la ligne 1.
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
27 févr. 2003 à 21:53
je comprends que tu veux ecrire dans un txt, ce qu'il faut savoir, veux tu pouvoir l'editer dans notepad par exemple pour le regarder, en ce cas on met en format string, sinon on laisse en binaire pour la vitesse.
0
cs_denini Messages postés 10 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 28 février 2003
27 févr. 2003 à 21:55
oui, je veux l'ecrire via notepad et mon programme le lis.
0
cs_denini Messages postés 10 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 28 février 2003
27 févr. 2003 à 22:08
Je veux bien mais ca ne correspond pas a ce que je veut, moi il a plusieurs date a chaque lignes car N actions. De plus j'ai du mal a comprendre ton code.

N'y a til pas moyen de fiare ca avec des librairies standard? Pour le ecriture on peut supposer qu'il n'y aura pas d'erreur.Est ce que tu pourrais me dire comment faire pour lire la ligne 4 colonne 2 par exemple et qd tu écris comment lui dire que tu veut ecrire la puis aller a la ligne.
0
cs_denini Messages postés 10 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 28 février 2003
28 févr. 2003 à 09:17
Merci beaucoup mais pourrais tu faire une exemple s'il te plait. Me montrer comment ecrire et ensuite lire.

01/02/02 100 3 01/03/02 250 4
01/04/02 100 2 04/04/02 300 5

me donner un exemple d'ecriture et un exemple de lecture par exemple la ligne 2 clonnes 4,5,6.
0
crocejf2000 Messages postés 260 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 27 août 2008 1
28 févr. 2003 à 09:57
Bon alors c'est pas tres simple mais je vais essayer :

#include
#include <fstream.h>

void Lecture(int NumLigne);
void Ecriture(char * Ligne,int NumLigne);
fstream * fs;

int main()
{
fs =new fstream("Test.txt",ios::ate | ios::app,filebuf::openprot);
int NroLigneALire=2;
Lecture(NroLigneALire);
Ecriture("Coucou",2);
return 0;

}

void Lecture(int NumLigne)
{
char ptLigne[256];
for (int i=0;i<NumLigne;i++)
fs->getline(ptLigne,255,'\n');
//Ici faire le traitement de la ligne NumLigne //
/*Exemple
char * Morceau;
Morceau = strtok(NumLigne,' ');
while (Morceau)
Morceau = strtok(NumLigne,' ');
*/
}

void Ecriture(char * Ligne,int NumLigne)
{
char ptLigne[256];
for (int i=0;i<(NumLigne-1);i++)
fs->getline(ptLigne,255,'\n');
fs << Ligne << endl;

}

Hart
0
cs_denini Messages postés 10 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 28 février 2003
28 févr. 2003 à 10:15
/*Exemple
char * Morceau;
Morceau = strtok(NumLigne,' ');
while (Morceau)
Morceau = strtok(NumLigne,' ');
*/
}

peut tu m'expliquer cela plus en detail? Merci beaucoup
0
crocejf2000 Messages postés 260 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 27 août 2008 1
28 févr. 2003 à 10:23
Pour toute les info que tu cherche, il y a la MSDN qui est tres complexe : http://msdn.microsoft.com/library/default.asp

Sinon, strtok sert a découper une chaine de caractere en plusieurs morceau selon le séparateur que tu lui pass en parametres.
Un exemple : (pris sur MSDN)

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

char string[] = "A string\tof ,,tokens\nand some more tokens";
char seps[] = " ,\t\n";
char *token;

void main( void )
{
printf( "%s\n\nTokens:\n", string );
/* Establish string and get the first token: */
token = strtok( string, seps );
while( token != NULL )
{
/* While there are tokens in "string" */
printf( " %s\n", token );
/* Get next token: */
token = strtok( NULL, seps );
}
}

Affichage :
A string of ,,tokens
and some more tokens

Tokens:
A
string
of
tokens
and
some
more
tokens

Tu peut utiliser strtok pour découper ta ligne, car il n'y a pas de notion de collonne, c'est a toi de gerer ca. Donc, tu prend ta ligne, et tu la découpe en plein de petit bout de ligne avec ton separateur ' '.

Note : Tu peut stocker té bout de chaine dans un string[]

J'espere que ca t'aidera,Hart
0
cs_denini Messages postés 10 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 28 février 2003
28 févr. 2003 à 10:46
> > char * Morceau;
> > Morceau = strtok(NumLigne,' ');
> > while (Morceau)
> > Morceau = strtok(NumLigne,' ');

g un ptit prob avec ca, il me met que je passe un int en paramètre alors que lui attent un char pour la fonction strtok
0
crocejf2000 Messages postés 260 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 27 août 2008 1
28 févr. 2003 à 11:01
Désolé, ce n'est pas numligne mais ptLigne mais c'était évident ...
Hart
0
cs_denini Messages postés 10 Date d'inscription jeudi 27 février 2003 Statut Membre Dernière intervention 28 février 2003
28 févr. 2003 à 11:37
jai tjs un problem, pour le 2eme parametre, il me dit que je met un char alors quil attend un const char. Que dois je faire?
0
crocejf2000 Messages postés 260 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 27 août 2008 1
28 févr. 2003 à 11:54
Il te dit ca car ptLigne doit etre déclaré en char*.
Donc tu met char* ptLigne au lieu de ptLigne[256]
Mais ca devrais poser probleme pour le getline.
essay de faire comme ca :

char * prLigne;
char Buffer[256]
fs.getline(Buffer) //ou quelque chose comme ca
memcpy(prLigne,Buffer,strlen(Buffer)); //il me semble
et apres le LigneDécoupé=strtok(prLigne,' ');

Hart
0
jonathanmcdougall Messages postés 64 Date d'inscription dimanche 9 février 2003 Statut Membre Dernière intervention 7 mars 2003
1 mars 2003 à 03:40
En passant, concernant les autres messages de ce thread, essayez de "snipper" un peu, d'enlever certains parties de message auxquelles vous ne répondez pas ou qui ne sont pas pertinentes.

> N'y a til pas moyen de fiare ca avec des librairies standard?
>Pour le ecriture on peut supposer qu'il n'y aura pas
>d'erreur.Est ce que tu pourrais me dire comment faire pour
>lire la ligne 4 colonne 2 par exemple et qd tu écris
>comment lui dire que tu veut ecrire la puis aller a la ligne.

Il n'y a pas de moyen standards de faire ça. Certains te diront que sous Windows, il faut utiliser les librairies Windows, mais je crois que c'est faux. La stl devrait être utilisée pour trois raisons :

1) Elle est plus rapide
2) Elle est plus efficace
3) Elle est plus portable

Ceci dit, il te faudra travailler un peu pour arriver à destination. Je ne te fournirai pas de code, seulement quelques pointeurs. De plus, apprend à ne pas demander de l'aide pour chaque erreur de compilation. Si tu passes un 'char' et qu'il te dit 'j'attends un const char', eh bien fait en sorte que ton 'char' soit un 'const char'.

Maintenant, le truc est de lire ligne par ligne et de faire le traitement ensuite :

# include <string> //pas de .h
# include <fstream> //pas de .h

const int MAX = 256; //la longueur max d'une ligne

char buffer[MAX]; //ton buffer
std::ifstream ifs; //ton ifstream

while (ifs.getline(buffer, MAX))
{
std::string ligne(buffer);

// 'ligne' contient une ligne à la fois

}

Note que tu n'as pas besoin de ta ligne 00/00/00... car getline() met l'état du stream à 'fail' lorsque le fichier est vide, et donc la boucle se termine.

À l'intérieur de cette boucle, tu dois donc 'parser' la ligne, c'est-à-dire séparer toutes les entités.

//un vector de std::strings
std::vector<std::string> tokens;

// l'index de l'espace
int index=0;
// l'index du début
int debut=0;

while (true)
{
index = ligne.find(' '); //cherche un espace

if (index == std::npos) //plus d'espaces
break;

//on ajoute le token correspondant à [debut, index[
//puisque substr() prend l'index et la *longueur*, on doit
//faire la soustraction
tokens.push_back(ligne.substr(index, index-debut));

// on a trouvé le premier token, on avance donc 'debut'
//juste après l'endroit où était l'espace
debut = index+1;

//c'est tout!
}

Tu dois faire cette boucle pour chaque ligne.

Maintenant, 'tokens' contient les colonnes. Il ne te reste qu'à modifier celle que tu veux :

tokens[2] = "8"; //mettre la 3e colonne à '8'

Bien sûr, il serait intéressant de faire un vector à deux dimensions :

std::vector< std::vector < std::string > > tokens;

Ainsi, tu pourras accéder aux lignes et aux colonnes comme ça :

token[ligne][colonne]

Pour changer une valeur dans ton fichier, la façon la plus simple est de le charger comme nous venons de faire, de modifier la valeur avec token[ligne][colonne] et de le réécrire à la place de l'ancien.

Pour plus d'informations, voit ton livre préféré sur le C++ et plus précisément la STL. "The Programming Language" de Stroustrup est très bon si tu t'y connais un peu, sinon quelque chose comme "C++ Primer" de Lippman et Lajoie ou "Accelerated C++" de Koenig et Moo. En français, je recommande "Programmer en langage C++" de Claude Delannoy, et, bien sûr, mon site web.

Bonne chance!
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
1 mars 2003 à 15:49
La STL est mieux pour 3 raisons:
1) + rapide
On ira pas au dela, deja assez drole.
Dispo pour concours devant huissiers, mon code contre code en pur STL.
Fichier txt de 20 Mo a traiter, pari de 10000 E ou $ comme et quand on voudra.
BruNews, ciao...
0
crocejf2000 Messages postés 260 Date d'inscription lundi 27 janvier 2003 Statut Membre Dernière intervention 27 août 2008 1
3 mars 2003 à 09:12
Salut Brunews,

Etant donné ta percéverance, j'ai bien envie de me mettre au STL, par curiosité. J'ai commencé a rechercher un peut de la doc mais aurai tu une doc complete ou un site pour voir un peut plus en détail ? et peut tu m'expliquer aussi ce que ca a voir avec kernel32 ?

Hart
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
3 mars 2003 à 11:47
NON et NON, je suis contre STL et autres trucs tout faits. C'etait en reponse a ce que t'avait mis jonathanmcdougall pour qui STL est le top et en 1er pour vitesse.
kernel32 est le noyau de Windows, donc pas de fopen etc mais CreateFile... Appels directs de API native, + rapide pas possible.
BruNews, ciao...
0
Rejoignez-nous