Fichier txt HELP !!!!!!!!

3463
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011
- 11 mai 2011 à 10:13
pop70
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
- 10 juin 2011 à 15:35
Salut !! Merci d'avance pour votre aide :

/*Récupération et lecture du tableau en .txt*/

float INPUT[nbredemesures];
FILE*ReadInput;
ReadInput=fopen("c:\\dossier\\fichier.txt","r" ) ;

if(ReadInput=NULL)
{
fprintf(stderr,("Erreur ouverture fichier\n"));
exit(-1);
}
for (int i=0 ; i<nbredemesures ; i++)
{
fscanf(ReadInput,"%f",&INPUT[i]);
}

fclose(ReadInput) ;
for (int i=0 ; i<nbredemesures ; i++)
{
printf("%f\n",INPUT[i]);
}

je ne comprends pas : à la compilation il ya un message d'erreur de microsoft....Ensuite je voudrai faire des calculs entre les différentes colonnes et stocker les résultats ds un nouveau tableau et avec ce nouveau tableau tracer des courbes sur excel.

Merci à tous : c très urgent !!!!!!

13 réponses

pop70
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
10
11 mai 2011 à 12:12
Bonjour,
Par message Microsoft, j'imagine quelque chose du genre "Erreur à l'adresse 0x...". Ceci vient généralement d'un problème d'allocation.

C'est le cas ici :

#include 



int main()
{
    int nbredemesures = 7; // attention, à des endroits du codes il était avec un s, alors qu'à d'autre non
    float *INPUT = new float[nbredemesures]; // Il faut allouer INPUT dans le tas pour pouvoir définir avec une taille variable.

    FILE*ReadInput;

    ReadInput=fopen("fichier.txt","r" ) ;

    if(ReadInput==0) // Ici il faut == , le = simple va supprimer le fichier... 
    {
    fprintf(stderr,("Erreur ouverture fichier\n"));
    exit(-1);
    }
    for (int i=0 ; i < nbredemesures;  i++)
    {
    fscanf(ReadInput,"%f", &INPUT[i]);
    }

    fclose(ReadInput) ;
    for (int i=0 ; i<nbredemesures ; i++)
    {
    printf("%f\n",INPUT[i]);
    }

    delete[] INPUT; // suppression du pointeur sur le tableau INPUT
}


J'ai mis le code dans le main pour pouvoir le tester directement.

C++dialement
Pop70
0
3463
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

11 mai 2011 à 14:28
Salut Pop70 !
Jte remercie énormément pour ton aide. Jsuis désolé mais je ne suis qu'un débutant ^^. Alors déja j'ai plus de messages d'erreur mais mon tableau possède 4 colonnes avec des nbres flottants et là je n'obtient qu'une seule colonne avec que des 0.00000.
Et après est-ce que tu saurais comment faire des calculs entre différentes colonnes ??

Merci bcp !!
0
3463
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

11 mai 2011 à 14:54
Mon fichier txt se présente comme ceci :
0,4 0,4 0,4
0,4 0,4 0,4
2,6 2,6 2,5
7,4 7,6 7,2
7,4 7,6 7,2
7,8 8,2 7,8
7,4 7,9 7,6
etc....

Et le nbre de lignes varient en fonction d'une valeur qu'aura saisi l'utilisateur : nbredemesures. J'ai défini cette variable plus haut :

printf("\n \n Veuillez indiquer la duree de mesure en jours : ");
scanf("%d",&duree);
printf("La duree de mesure selectionnee est de %d jour(s).\n",duree);

nbredemesures=144*duree;
printf("\n \n Il y a %d mesures prises en compte.\n",nbredemesures);
0
pop70
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
10
11 mai 2011 à 16:11
Attention : Dans le fichier, pour qu'un flottant soit lu, il faut des points et non des virgules, ce qui explique les "0.000000".

Autrement dit, ceci :
0,4 0,4 0,4 
0,4 0,4 0,4 
2,6 2,6 2,5 
7,4 7,6 7,2 
7,4 7,6 7,2 
7,8 8,2 7,8 
7,4 7,9 7,6 
etc.... 


donne :

0.4 0.4 0.4 
0.4 0.4 0.4 
2.6 2.6 2.5 
7.4 7.6 7.2 
7.4 7.6 7.2 
7.8 8.2 7.8 
7.4 7.9 7.6 
etc.....


Et pour prendre tous les éléments, il faut s'assurer que nbredemesures soit égal au nombre de colonne * le nombre de lignes.

C++dialement,

Pop70
0

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

Posez votre question
3463
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

11 mai 2011 à 16:31
ok merci encore !

mais ça m'aligne tout sur une même colonne et je souhaiterai l'afficher comme sur mon doc.txt.

Il me semble que c un truc du style : printf("%f, %f, %f, %f\n",INPUT[i]); non ??
0
pop70
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
10
11 mai 2011 à 17:33
Pour afficher comme dans le fichier texte, il suffit de faire une séparation entre chaque élément, et un saut de ligne tous les 4 éléments (nombre de colonnes):

#include 

int main()
{
    int nbredemesures = 14;
    float *INPUT = new float[nbredemesures];

    FILE*ReadInput;

    ReadInput=fopen("fichier.txt","r" ) ;

    if(ReadInput==0)
    {
        fprintf(stderr,("Erreur ouverture fichier\n"));
        exit(-1);
    }


    for (int i=0 ; i < nbredemesures;  i++)
    {
        fscanf(ReadInput,"%f", &INPUT[i]);
    }


    printf("\n\n");
    float ligne[4] = { 0};

    fclose(ReadInput) ;
    for (int i=0 ; (i+4)<nbredemesures ; i+= 4) // On prend ligne par ligne
    {
        for (int j = i; j < i + 4; j++)
        {
            printf("\t%f",INPUT[j]); // et on affiche élément par élément
        }
        printf ("\n");
    }

    delete[] INPUT;
}


C++dialement,

Pop70
0
3463
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

12 mai 2011 à 08:33
Merci encore !!!
Une dernière question et après jte laisse tranquille . Est ce que tu saurais faire des opérations entre des colonnes (que l'utilisateur aura choisit préalablement) ?? Genre Moyenne, ecart-type etc....

Et comment mettre ces résultats dans un autre tableau qu'on pourra exporter sous Excel pour tracer des courbes ?
0
pop70
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
10
12 mai 2011 à 21:21
Ralala ... On peut dire que tu as de la chance, j'ai du faire ceci il y a moins de une semaine .

J'avais fait pas mal de recherches pour exporter vers excel, et ce qui m'a semblé le plus simple c'est d'enregistrer sous forme de fichier xml.

Cela se présente comme ceci :

<?xml version="1.0"?>
<Root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<row>
<ColonneA>Donnée1</ColonneA>
<ColonneB>Donnée2</ColonneB>
//...
</row>
<row>
<ColonneA>Donnée4</ColonneA>
<ColonneB>Donnée5</ColonneB>
</row>
//...
</Root>


Ce code donne :
ColonneA  ColonneB
Donnée1    Donnée2
Donnée4    Donnée5
//...      ...


Le tout s'enregistre au format .xls, et s'ouvre automatiquement avec excel qui va demander 2 trucs à l'ouverture :
au premier il faut répondre : "En tant que liste XML", et au 2ème il faut cliquer sur "Ok" pour que le schéma sur lequel se base excel soit fait automatiquement (je pense que ce

n'est pas la peine de détailler plus, ça n'a pas grand rapport avec le code).

Quant au fameux code : (il est a ajuster pour le mettre dans une fonction au lieu du main)

#include 
#include <fstream> // Pour l'enregitrement j'utilise fstream

void afficheColonne(float [], int); // Fonction pour vérifier le contenu d'une colone
void EnregistrerUneColonne(float[], float[], float[], float[], int); // Un fonction qui enregistre les 4 colonnes

int main()
{

    int nbredemesures = 25; // Au pif, ici c'est encore dans le main pour faire un test

    float *INPUT = new float[nbredemesures];
    int nbElementsColonne = (int)(nbredemesures / 4);
    FILE*ReadInput;

    ReadInput=fopen("fichier.txt","r" ) ;

    if(ReadInput==0)
    {
        fprintf(stderr,("Erreur ouverture fichier\n"));
        exit(-1);
    }


    for (int i=0 ; i < nbredemesures;  i++)
    {
        fscanf(ReadInput,"%f", &INPUT[i]);
    }


    printf("\n\n");
    float ligne[4] = { 0};
//Les 4 colonnes :
    float *colonneA = new float[nbElementsColonne];
    float *colonneB = new float[nbElementsColonne];
    float *colonneC = new float[nbElementsColonne];
    float *colonneD = new float[nbElementsColonne];
// Leurs initialisations
    for (int i = 0; i < nbElementsColonne; i++)
    {
        colonneA[i] = 0;
        colonneB[i] = 0;
        colonneC[i] = 0;
        colonneD[i] = 0;
    }

    fclose(ReadInput) ;
    int index = 0; // Compte le nombre de lignes dans la colonne
    for (int i=0 ; (i+4)<nbredemesures ; i+= 4) // On prend ligne par ligne
    {
        for (int j = i; j < i + 4; j++)
        {
                printf("\t%f",INPUT[j]); // et on affiche élément par élément

                if (j == i)
                {
                   colonneA[index] = INPUT[j];  // Remplis la colonne A à la ligne index, tous les 4 i 
                }
               else if ( j == (i+1))
               {
                    colonneB[index] = INPUT[j]; // Idem pour B mais avec la valeur suivante
                }
                else if (j == (i+2))
                 {
                    colonneC[index] = INPUT[j]; // ...
                }
                else
                {
                    colonneD[index] = INPUT[j]; //...
                }
            }
                    index ++;

                  printf ("\n");
        }

// Affiche le contenu des colonnes pour vérification :
    printf ("\nColonne A : \n");
    afficheColonne(colonneA, nbElementsColonne);
    printf ("\nColonne B : \n");
    afficheColonne(colonneB, nbElementsColonne);
    printf ("\nColonne C : \n");
    afficheColonne(colonneC, nbElementsColonne);
    printf ("\nColonne D : \n");
    afficheColonne(colonneD, nbElementsColonne);

// Enregistre les colonne avec une fonction (pour pas surcharger le main qui est déjà pas mal grand... :
    EnregistrerUneColonne(colonneA, colonneB, colonneC, colonneD, nbElementsColonne);

// Supprime les tableaux du tas :
    delete[] colonneA;
    delete[] colonneB;
    delete[] colonneC;
    delete[] colonneD;
    delete[] INPUT;
}


// Fonction d'affichage :
void afficheColonne(float colonne[], int nombreElements)
{
  for (int i = 0; i <  nombreElements; i++)
  {
    std::cout << colonne[i] << std::endl;
  }
}

// Enregistement :
void EnregistrerUneColonne(float colonneA[], float colonneB[], float colonneC[], float colonneD[], int nbreLignes)
{
     // ouvre le fichier  en écriture, le crée s'il n'existe pas et remplace le fichier existant

    std::ofstream fichier; // Ouvre un fichier façon fstream (ça fait pareil que FILE *)

    fichier.open("fichierExcel.xls", std::ios::out); // Ouvre le fichier (ou crée) fichierExcel.xls à coté de l'éxecutable, et le vide (par défaut)

    if (fichier) // Si y'a pas eu d'erreur au niveau du fichier on continu
    {

            std::cout << "\n**Enregistrement**\n"; // <- Si ça ne s'affiche dans la console, c'est que le fichier est pas ouvert
// En-tête :
            fichier << "<?xml version="1.0"?>\n<Root xmlns:xsi="http:\/\/www.w3.org\/2001\/XMLSchema-instance">\n"; 
// Remplissage :
            for (int i = 0; i < nbreLignes; i++)
            {
                fichier << "\t<row>\n\t\t<ColonneA>";
                fichier << colonneA[i];
                fichier << "</ColonneA>\n\t\t";
                fichier << "<ColonneB>";
                fichier << colonneB[i];
                fichier << "</ColonneB>\n\t\t";
                fichier << "<ColonneC>";
                fichier << colonneC[i];
                fichier << "</ColonneC>\n\t\t";
                fichier << "<ColonneD>";
                fichier << colonneD[i];
                fichier << "</ColonneD>\n";
                fichier << "\t</row>\n";
            }	
        fichier << "</Root>";// Pour finir le fichier en xml correctement

        fichier.close();	// Et fermeture
    }
}


Et voila !

Du coté des nom de variables c'est à revoir au départ j'avais pris nbredemesures comme le nombre de chiffres dans le fichier...Mais bon ça ne change rien au calcul, tant que c'est bien ceci qu'on lui donne. J'ai testé avec un fichier "fichier.txt" qui contient :
1.5 2.3 3.54 4.78 
5 6 7 8.8 
9.54 10.4 11.4 12.5585 
13.1 14 15 16
17 18.65 19.48 20.16
21 22.13 23 24

Et marche très bien, le fichier excel créé ("fichierExcel.xls") a 4 colonnes A,B,C,D qui contiennent les chiffres dans l'ordre, avec les décimales.

Bon ben voila, (enfin je crois)

C++dialement,

Pop70
0
3463
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

13 mai 2011 à 14:48
Bon, c'est encore super sympa de ta part, je galère un peu (hé oui ! jsuis une vraie chèvre en programmation !!) mais jpense que ça va le faire. J'ai cependant que des 0 dans les 4 colonnes : je ne retrouve pas mon tableau.

Mais là où je galère vraiment vraiment c'est que je ne sais pas comment faire des calculs entre les différentes colonnes de mon tableau : en .txt
Je voudrai que le programme calcule des pentes entre différentes colonnes que l'utilisateur va choisir en gros : y2-y1/x2-x1 puis y3-y2/x3-x2 etc. Donc faire une sorte de boucle jusq'à ce que ça atteigne nbredemesure.

Ensuite faire la moyenne de toutes ces pentes et stocker ces valeurs dans le fameux tableau qu'on ouvre après avec excel
Et je voudrais savoir commetn on pourrait chercher une valeur dans le tableau : ex combien il ya de zéros ? et ce que ça représente en pourcentage.

J'ai déja fais ça mais jpense que c'est pas bon : car j'essaye qd même de chercher de mon côté...mais bon voilà quoi...qd on débute c chaud !!


Promis c'est la dernière question que je te pose
0
3463
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

13 mai 2011 à 14:49
# include <stdio.h>
# include <stdlib.h>
# include
# include <fstream>
# include <string>
# include <math.h>
# include<conio.h>

using namespace std;

int main()
{
int numerateur, denominateur,occurrence, i, compteur_colonne, compteur_ligne,nombre;
float resultat;
char colonne_numerateur, colonne_denominateur, pourcentage;
int nbcol_matrice 0, nbligne_matrice 0;
int matrice[nbcol_matrice][nbligne_matrice];


//Calcul de la pente

printf("Saisir numerateur : ");
scanf("%d",&colonne_numerateur);

printf("Saisir denominateur : ");
scanf("%d",&colonne_denominateur);

for (int i=0 ; i <= nbligne_matrice + 1; i++)
{ numerateur = matrice[colonne_numerateur][i] - matrice[colonne_numerateur][i-1 ];
denominateur = matrice[colonne_denominateur][i] - matrice[colonne_denominateur][i-1];
resultat=numerateur / denominateur;
}

printf("La pente vaut : %f ",resultat);

//Calcul de la moyenne

printf("Saisir nombre: ");
scanf("%d",&nombre);

int compteur_total=0;


for (compteur_colonne = 0; compteur_colonne <= nbcol_matrice - 1; compteur_colonne ++)
{
for(compteur_ligne = 0; compteur_ligne <= nbligne_matrice - 1 ; compteur_ligne ++)
{
if (matrice[compteur_ligne][compteur_colonne] == nombre)
{
occurrence = occurrence + 1;
}
compteur_total = compteur_total + 1;
}
}

pourcentage=occurrence * 100 / compteur_total;

printf("Resultat du pourcentage : %c,pourcentage");

getch();
return 0;
}
0
3463
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

10 juin 2011 à 14:26
Tu veux plus m'aider ???
0
pop70
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
10
10 juin 2011 à 15:32
J'avais presque oublié ce post...
C'est à dire que là j'ai plus trop le temps.
Je pense que tu devrais refaire un nouveau post, celui-ci commence en effet dater et beaucoup de personnes passent à coté du fait qu'il ne soit plus sur la première page.

Bonne chance

Pop70;
0
pop70
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
10
10 juin 2011 à 15:35
Oups désolé ! Je n'avais pas vu que tu l'avais déjà fait.


Pop70
0