2016-10-12 7 views
2

Meine Daten sieht wie folgt aus:Trouble in Werte aus der Datei zu lesen

4.2 6.0 

    3.1 4.0 

10.5 10.0 

23.0 8.0 

9.7  4.0 

15.9 5.0 

Ich versuche, in zwei Werte zu einem Zeitpunkt, zu lesen, ordnen sie meine Variable, und aus den Ergebnissen drucken. Ich kann nicht herausfinden, warum die Werte in nicht gelesen werden. Meine Vorlage wird in meine Ausgabe-TXT-Datei gedruckt, aber keiner meiner Werte darunter wird ausgedruckt.

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 
#define INPUT_FILE "lab3.dat" 
#define ANSWER_FILE "lab3.txt" 

int main(void) 
{ 
int nsides; 
double radius; 
double perimeter; 
double area; 

FILE* my_data; 
FILE* out_file; 

my_data = fopen(INPUT_FILE, "r"); 
if(my_data == NULL) 
{ 
    printf("Error on opening the data file\n"); 
    exit(0); 
} 

out_file = fopen(ANSWER_FILE,"w"); 
if(out_file == NULL) 
{ 
    printf("Error on opening the output file\n"); 
    exit(0); 
} 

perimeter = 2*nsides*radius*sin(M_PI/nsides); 
area = 0.5*nsides*(radius*radius)*sin((2*M_PI)/nsides); 

fprintf(out_file, "\nNima Sarrafzadeh. Lab 3.\n\n"); 
fprintf(out_file, "   Number Perimeter Area Of \n"); 
fprintf(out_file, " Radius Of Sides Of Polygon Polygon \n"); 
fprintf(out_file, "-------- -------- ------------ ----------- \n"); 
while((fscanf(my_data, "%d%d", &radius, &nsides))==2){ 
    fprintf(out_file, "%d %d %d %d",radius, nsides, perimeter, area, "\n"); 
} 

fclose(my_data); 
fclose(out_file); 
}  
+0

Sie müssen 'Bereich' und 'Umfang' für jedes gelesene Zahlenpaar berechnen - in der 'while()' - Schleife, nach dem Aufruf von 'fscanf()' und vor dem Aufruf von 'fprintf()' . –

+0

@ DavidC.Rankin Es gibt ein 'fscanf()', das in der Bedingung 'while()' -loop bedingt ist. –

+0

Ja, ich vermisste es unter dem Header ':)' (nachdem die Berechnung ohne es gemacht wurde) –

Antwort

2

Wo Ihr unmittelbares Problem auftritt, ist Ihr Versuch, Ihre integer und double lesen aus der Datei zu mischen. Da die Datei Werte mit einem Dezimalpunkt enthält, müssen Sie beide als double (oder float) lesen und dann den realen Teil für Ihre Ganzzahl nsides nehmen.

Ihr Compiler sollte auch schreien Warnungen an Sie für Ihre Verwendung von fscanf und fprintf (speziell angesichts der ungültigen Zeigertypen und zu viele Argumente für das Format). Wenn Sie keine Anzahl von Warnungen sehen, stellen Sie sicher, dass Sie immer mit (z. B. mit -Wall -Wextra Warnungen und für fast alle möglichen Warnungen, fügen Sie -pedantic) kompilieren. Akzeptieren Sie keinen Code, der mit Warnungen zusammenstellt.

Wenn Sie Ihre Formatzeichenfolgen etwas überdenken und die '\n' in die Formatzeichenfolge aufnehmen, wo sie hingehört, können Sie Folgendes tun: (Beachten Sie, dass die Dateinamen für Eingabe/Ausgabe das erste und zweite Argument sind). jeweils (säumigen/Schreib zu stdin/stdout zu lesen, wenn keine Argumente angegeben werden))

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

int main (int argc, char **argv) { 

    int nsides = 0; 
    double radius, perimeter, area, ntmp; 
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin, 
     *ofp = argc > 2 ? fopen (argv[1], "w+") : stdout; 

    if (!fp || !ofp) { /* validate files open for reading/writing */ 
     fprintf (stderr, "error: file open failed\n"); 
     return 1; 
    } 

    /* write heading to output file */ 
    fprintf (ofp, "\nNima Sarrafzadeh. Lab 3.\n\n" 
        "   Number Perimeter  Area Of \n" 
        " Radius Of Sides Of Polygon Polygon \n" 
        "-------- -------- ------------ ----------- \n"); 

    /* validate 2 values read for each iteration */ 
    while (fscanf (fp, " %lf %lf", &radius, &ntmp) == 2) { 
     nsides = (int)ntmp; 
     perimeter = 2*nsides*radius*sin(M_PI/nsides); 
     area = 0.5*nsides*(radius*radius)*sin((2*M_PI)/nsides); 
     fprintf (ofp, "%7.2lf %7d %10.2lf %10.2lf\n", 
       radius, nsides, perimeter, area); 
    } 

    if (fp != stdin) fclose (fp);  /* close file if not stdin */ 
    if (ofp != stdout) fclose (fp); /* close file if not stdout */ 

    return 0; 
} 

besonderes Augenmerk auf die Validate Kommentar bezüglich fscanf bezahlen.

Beispiel Verwendung/Output

$ ./bin/perim <dat/pairs.txt 

Nima Sarrafzadeh. Lab 3. 

      Number Perimeter  Area Of 
Radius Of Sides Of Polygon Polygon 
-------- -------- ------------ ----------- 
    4.20  6  25.20  45.83 
    3.10  4  17.54  19.22 
    10.50  10  64.89  324.02 
    23.00  8  140.83 1496.24 
    9.70  4  54.87  188.18 
    15.90  5  93.46  601.09 

Blick über Dinge und lassen Sie mich wissen, wenn Sie weitere Fragen haben.

+0

Danke! Das hilft sehr. Der Grund, warum ich keine Fehler sah, war, dass ich PuTTy benutzte, denke ich. Ich verstehe nicht wirklich, warum du int argc benutzt hast, char ** argv, obwohl ich das vorher nicht gesehen habe. –

+0

'char * argv []' ist äquivalent zu 'char ** argv', wenn es in der Parameterliste einer Funktion verwendet wird (' ie main() '), denn wenn ein Array als Parameter übergeben wird, wird das Array in a konvertiert * Zeiger *) Somit sind 'int main (int argc, char * argv [])' und 'int main (int argc, char ** argv)' äquivalent. –