Petit souci de séparateur en C++

Résolu/Fermé
KiraX10A Messages postés 231 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 29 décembre 2016 - 17 sept. 2009 à 10:55
KiraX10A Messages postés 231 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 29 décembre 2016 - 17 sept. 2009 à 13:57
Bonjour à tous.


Mon problème est le suivant:

J'ai un fichier (que j'appellerai "fichier.csv") qui se compose de la manière suivante:

NOM MAGAZINE1;NOMBRES DE PAGES;CODE;TYPE;DATE;TARIFS;
NOM MAGAZINE2;NOMBRES DE PAGES;CODE;TYPE;DATE;TARIFS;
NOM MAGAZINE3;NOMBRES DE PAGES;CODE;TYPE;DATE;TARIFS;
NOM MAGAZINE4;NOMBRES DE PAGES;CODE;TYPE;DATE;TARIFS;
...
NOM MAGAZINEX;NOMBRES DE PAGES;CODE;TYPE;DATE;TARIFS;


Ce que je dois faire, c'est ouvrir ce fichier et ne récupérer que les colonnes NOM MAGAZINE et TARIFS.
J'arrive à récupérer le fichier entier, à le recopier dans un document.txt mais je ne vois pas du tout comment faire pour dire à mon programme de ne récupérer que la chaine de caracteres située avant le premier ";" et la chaine de caractere située avant le dernier ";".

Voilà mon programme pour le moment; il compile correctement mais lors de l'éxécution, rien ne s'affiche dans la console:

// Tri Titres-Tarifs.cpp : définit le point d'entrée pour l'application console.
//

////////////////////////////////////////////////////////////////////////////////////////////////
///										Travail demandé:									 ///
///																							 ///
/// Ecrire un programme en C/C++ qui permettrait de, tout dabord trier les titres des		 ///
/// magazines par ordre alphabetique, avec leur nombre et le total de leurs tarifs.			 ///
/// Il faudra ensuite faire la moyenne de ces tarifs pour chaque magazines.					 ///
///																							 ///
////////////////////////////////////////////////////////////////////////////////////////////////


/////////////////////
/// Bibliothèques ///
/////////////////////

#include <stdio.h>
#include <stdlib.h>
#include <stdafx.h>
#include <string.h>
#include <iostream>
using namespace std;


#define TAILLE_MAX 100


///////////////////////////
/// Programme Principal ///
///////////////////////////

int _tmain(int argc, _TCHAR* argv[])
{
	FILE *fichier1 = 0;		// Initialisation à 0 d'un pointeur sur fichier.
	FILE *fichier2 = 0;
	int CaractereActuel = 0;	// Initialisation d'une variable CaractereActuel à 0.

	// Ouverture du fichier 20090727-TABLES_EDI.csv en lecture.
	fichier1 = fopen("C:\\Documents and Settings\\bastien\\Bureau\\Offres - Tables EDI Excel\\20090727-TABLES_EDI.csv", "r");

	/* Test du fichier1 */
	if(fichier1 != NULL)
	{
		do
		{
			CaractereActuel = fgetc(fichier1);	// Récupère un caractère à la fois
			do
			{
				// Ouverture d'un fichier pour écrire le caractère lu.
				fichier2 = fopen("C:\\Documents and Settings\\bastien\\Bureau\\fichier_test_ecriture.txt", "w");
				/* Test fichier2 */
				if(fichier2 != NULL)
				{
				if(CaractereActuel == ';')	// Si le caratère qui ets lu est un ";", alors on écrit un saut de ligne dans le fichier2
					fputs("\n", fichier2);
				else	// Sinon, on écrit chaque caractère qui est lu
				{
					fputc(CaractereActuel, fichier2);
				}
				fclose(fichier2);
				}
				else
					cout << "Erreur lors de l'ouverture du fichier fichier_test_ecriture.txt" << endl;
			}
			while(CaractereActuel != ';');	// Je boucle tant que le caractère qui est lu n'est pas ";"
		}
		while(CaractereActuel != EOF);
		fclose(fichier1);
	}
	/* Fin du test du fichier */
	else
		cout << "Erreur lors de l'ouverture du fichier 20090727-TABLES_EDI.csv" << endl;
	return 0;
}



J'espere avoir été suffisement clair, sinon poser moi des questions sur ce dont vous ne comprenez pas.

Merci d'avance de votre aide

2 réponses

Tu demandes du C++, je te propose une fonction permettant de réaliser à peu près ce que tu désires. A partir d'une ligne, elle construit une liste. A toi de l'adapter.
#include <iostream>
#include <list>
#include <string>
using namespace std;

void decoupe(string& chaine, string& delimiteur, list<string>& liste)
{
  string::size_type pos, pos_ex = 0;
  while ( (pos = chaine.find(delimiteur, pos_ex)) != string::npos)
  {
    liste.push_back(chaine.substr(pos_ex, pos-pos_ex));
    pos_ex = pos + 1;
  }
  liste.push_back(chaine.substr(pos_ex));
}

int main()
{
  string chn("abc;def;ghi");
  string delim(";");
  list<string> lst;

  decoupe(chn, delim, lst);
  list<string>::iterator iter = lst.begin();
  while (iter != lst.end())
    cout << *iter++ << endl;

  return 0;
}
Bonne continuation.
0
KiraX10A Messages postés 231 Date d'inscription jeudi 29 janvier 2009 Statut Membre Dernière intervention 29 décembre 2016 20
17 sept. 2009 à 13:57
Merci beaucoup ca ma bcp aidé ^^
0