cs_denini
Messages postés10Date d'inscriptionjeudi 27 février 2003StatutMembreDernière intervention28 février 2003
-
27 févr. 2003 à 21:11
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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
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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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...
cs_denini
Messages postés10Date d'inscriptionjeudi 27 février 2003StatutMembreDernière intervention28 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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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 ?
Vous n’avez pas trouvé la réponse que vous recherchez ?
cs_denini
Messages postés10Date d'inscriptionjeudi 27 février 2003StatutMembreDernière intervention28 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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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.
cs_denini
Messages postés10Date d'inscriptionjeudi 27 février 2003StatutMembreDernière intervention28 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.
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;
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[]
crocejf2000
Messages postés260Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention27 août 20081 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,' ');
jonathanmcdougall
Messages postés64Date d'inscriptiondimanche 9 février 2003StatutMembreDerniè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
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 :
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.
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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...
crocejf2000
Messages postés260Date d'inscriptionlundi 27 janvier 2003StatutMembreDernière intervention27 août 20081 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 ?
BruNews
Messages postés21040Date d'inscriptionjeudi 23 janvier 2003StatutModérateurDernière intervention21 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...