Fichier txt HELP !!!!!!!!

Signaler
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011
-
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
-
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

Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
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
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

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 !!
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

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);
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
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
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

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 ??
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
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
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

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 ?
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
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
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

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
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

# 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;
}
Messages postés
23
Date d'inscription
lundi 9 mai 2011
Statut
Membre
Dernière intervention
22 juin 2011

Tu veux plus m'aider ???
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
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;
Messages postés
181
Date d'inscription
mardi 6 avril 2010
Statut
Membre
Dernière intervention
7 janvier 2012
8
Oups désolé ! Je n'avais pas vu que tu l'avais déjà fait.


Pop70