2010-12-01 12 views
1

je suit dans un fichier texte appelé: Values.TXTc la langue: le contenu du fichier lu les numéros et les additionner

1 4 
2.5 3.76 
122 10 
277.543 
165.4432 

Je suis en train de lire le contenu de ce fichier texte et ajoutez chaque deux paires ensemble et sortie le résultat ... la sortie serait quelque chose comme ceci:

1 Pair:(1, 4) = 5 

2 Pair:(2.5, 3.76)= 6.26 

et ainsi de suite ..

J'ouvre le fichier comme celui-ci

int c; 
FILE myfile; 

myfile= fopen("values.txt", "r"); 
if (myfile == NULL) { 
    printf("Cannot open TEXT file\n"); 
    return 1; 
} 

double aa,bb; 
while ((c = getc(myfile)) != EOF) { 
    // HERE SHOULD I DO THE OUTPUT BUT HOW? 
} 

Toute aide est vraiment apprécié ..

Language = C

+0

Est-ce pour les devoirs? –

Répondre

0

Pour cette tâche simple, utilisez

double a, b; 
if (fscanf(myfile, "%lf %lf", &a, &b) == 2) 
     printf("%f + %f = %f\n", a, b, a+b);
.

0

ressemble à un problème de travail, mais fscanf peut lire la chaîne dans une variable comme:

int n; 
fscanf (myfile,"%d",&n); 
+0

non ce n'est pas un devoir ... iam essayant de calculer la différence de temps entre les images iam extrayant d'un film ... – cprogram

+0

Puisque certains des nombres semblent être fractionnaires, le format '% d' et' int' type ne sont probablement pas le meilleur match. –

+0

puis utilisez '% f' et' float' –

2

Le code suivant fait ce que vous attendez. myfile doit être déclaré comme FICHIER *. fopen renvoie un pointeur sur la structure FILE. Si le fichier est très volumineux, je vous recommande de lire dans des tampons de grande taille (par exemple: 65535 etc.) et d'analyser char par char et de le convertir en valeurs flottantes. Il réduit la surcharge des appels système, ce qui prend plus de temps que le traitement du texte pour les valeurs flottantes.

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

main(int argc, char *argv[]) 
{ 
    FILE* myfile; 

    myfile = fopen("values.txt", "r"); 
    if (myfile == NULL) { 
     printf("Cannot open TEXT file\n"); 
     return 1; 
    } 

    double aa,bb; 
    while (2 == fscanf(myfile, "%lf %lf", &aa, &bb)) { 
     printf("%lf\n", aa+bb); 
    } 
    return 0; 
} 
+0

merci pour la réponse .. je sais comment le faire en C++ avec le bon décalage >> mais je ne savais pas comment le faire en c Merci encore – cprogram

0

Vous ne l'avez pas montré ce dont vous avez besoin en tant que sortie pour les lignes à valeur unique, mais cela ressemble à un cas pour fgets() et sscanf(), sauf si vous voulez vraiment les deux lignes avec une valeur unique à traiter comme une unité.

char buffer[256]; 
int rownum = 0; 
while (fgets(buffer, sizeof(buffer), myfile) != 0) 
{ 
    double aa, bb; 
    int n = sscanf(buffer, "%lf %lf", &aa, &bb); 
    if (n == 2) 
     printf("%d Pair:(%g, %g) = %g\n", ++rownum, aa, bb, aa+bb); 
    else if (n == 1) 
     printf("%d Solo:(%g) = %g\n", ++rownum, aa, aa); 
    else 
    { 
     printf("Failed to find any numbers in <<%s>>\n", buffer); 
    } 
} 

Si vous avez utilisé fscanf(myfile, "%g %g", &aa, &bb), il lirait sur les nouvelles lignes (ils comptent comme l'espace blanc) à la recherche de chiffres, il lirait un numéro d'une ligne, et la seconde d'une autre ligne. Ce n'est généralement pas ce que les gens recherchent (mais quand c'est ce dont vous avez besoin, c'est extrêmement utile). Récupération d'erreur avec fscanf() a tendance à être plus lourde qu'avec fgets() et sscanf().

0

son dans C++ désolé :(Je ne sais pas c

c'est un code logique très simple pour Minde simple: D im un begineer aussi, je nai testé ce prog désolé si quelque chose va mal, mais exactement sur un même principe fonctionnait mon analyseur et cela a fonctionné très bien, donc c'est une vraie méthode pas très efficace mais ... n'utilisez pas ce programme tout de suite, comprenez-en la logique, cela vous aidera beaucoup, la copie qui ne vous donnera rien ... les tuteurs d'analyseur sont si rares ....

int x = 0; char ch = 'r'; // j'ai utilisé cette équation pour éviter sur le premier ckeck du ch. il doit être rempli par quelque chose quand le programme commence. char bigch [10]; int numéro de contrôle = 0;

float firstnumber = 0; float secondnumber = 0; résultat du flotteur = 0;

void clearar (char debibar [10], int xar) // cette fonction devient bigch comme référence ce qui veut dire que les changements effectués ici affecteront directement le bigch lui-même. Cette fonction obtient la longueur réelle du tableau et place les espaces dans chaque élément de bigch pour mettre à zéro les nombres. nous devons effacer bigch de tous les numéros précédents. En bas, tu verras pourquoi j'avais besoin de ça. 'xar' est le x de la fonction principale. C'est ici pour dire à notre nettoyeur le la vraie longueur des éléments bigar remplis. {for (int i = 0; i}

}

int main() { < -------------------// ici vous ajoutez des commandes d'ouverture et de lecture de fichier while (! myfile.eof()) // alors que la fin du fichier txt n'a pas été atteinte { ch = monfichier.get(); // récupère chaque lettre dans ch, et faire un curseur avancer dans le fichier txt pour plus de lecture get() le curseur redirige automatiquement

if (ch!= " ")     //i used space as an indicator where one number ends 
            //so while space havent been reahced, read letters. 
    { bigch[x] = ch;    //get read letter into bigch array. 
     x++;      //icrement bigch array step 

    } 
else 

if(ch == " ")    //if space is reached that means one number has ended and 
    {      im trying to set a flag at that moment. it will be used further. 
    checknumber++;   the flag is simple number. first space will set checknumber to 1 
          second space will set it to 2. thats all. 
    } 

    if (checknumber == 1)      //if our checknumber is 1, wich means that reading 
              of first number is done, lets make one whole float    
              from that bigch array. 

{firstnumber = atof (bigch); // Ici, nous obtenons bigch, atof (array to float) commande convertit tableau de bigch en un nombre entier flottant.

clearar(bigch,x);        //here we send bigch and its element step into function where 
               bigch gets cleaned because we dont want some ghost numbers in it. 
               abviously clearar function cleans bigch int main function aswell, 
                not only in it's teritory. its a global cleaning :) 
     } 
    else if (checknumber ==2)      //here we do the same but if flag is 2 this means that two spaces 
                had been passed and its time to convert bigch into secondnumber. 
      { secondnumber = atof(bigch);   //same method of converting array into float (it hates other 
                not number letters, i mean if its a number its fine. if in your text 
                was 'a' or 's' in that case atof will panic hehe..) 
      clearar(bigch,x);      //same thing, we send bigch to cleaner function to kill any numbers 
                it, we get one space letter (" ") into each element of bigch. 
      } 

numéro de contrôle = 0; si les deux nombres avaient été lus et convertis. nous devons réinitialiser le signaleur d'espace . et commencez à compter le formulaire 0; pour les numéros de paires suivantes.

résultat = premier numéro + second numéro; bien ici tout est clair. } }