2016-04-11 11 views
0

Ich bin Bauingenieur Student, und ja, natürlich ist es nicht Programmierung wichtiger. Ich mache eine App zur Berechnung der "Bodenstärke", die mit Excel nicht berechnet werden kann.Wie lese ich Text aus einer Datei und gebe ihn in eine Variable ein

also habe ich bereits einen Algorithmus für meine App, und ich möchte versuchen, Float-Wert in einem Float-Array durch Lesen einer TXT-Datei setzen.

Beispiel ist dies der Inhalt meiner .txt-Datei:

12 
12.5 
16.3 
13.4 
17.4 
14.3 
25.6 
25.2 
12.5 
63.5 

nur eine einfache TXT-Datei, und ich will jede Zahl in ein Array zuweisen. aber ich weiß nicht wie. die Nummer der Nummer in dieser .txt-Datei ist unsicher, sie könnte 20 Zahlen, 36 Zahlen usw. enthalten. Ich habe gelesen, wie man eine Datei aus einem Buch liest, aber es kann keine ganze Datei mit einer unsicheren Anzahl von Nummern

lesen

Bitte helfen Sie mir, dieses Problem zu beheben, so dass alle meine Freundin eine Aufgabe leicht beenden konnte. Vielen Dank!

+0

@JoachimPileborg aber ich benutze C, nicht C++. funktioniert mein C-Code? – FDuldul

+1

"funktioniert mein C-Code?" -> Es gibt keinen verbuchten C-Code. – chux

+2

@chux, aber ich habe ein "C" -Tag in meiner Frage, nicht C++ – FDuldul

Antwort

3

Das Problem ist ziemlich einfach. Da Sie eine unbekannte Anzahl von float s lesen, reservieren Sie Speicher für einige vernünftigerweise erwartete Menge. Lesen Sie die Datei aus der Datei in Ihr Array, bis Sie dieses Limit erreicht haben, und weisen Sie dann bei Bedarf weitere Speicherbereiche zu.

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

#define NFLTS 64 

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

    float *fltarr = NULL; 
    size_t i = 0, nflts = NFLTS; 
    FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin; 

    if (!fp) { /* validate file open for reading */ 
     fprintf (stderr, "error: file open failed '%s'.\n", argv[1]); 
     return 1; 
    } 
    /* allocate NFLTS floats initially */ 
    if (!(fltarr = malloc (NFLTS * sizeof *fltarr))) { 
     fprintf (stderr, "error: virtual memory exhausted.\n"); 
     return 1; 
    } 
    /* for each float in file */ 
    while (fscanf (fp, "%f", &fltarr[i]) == 1) { 
     if (i + 1 == nflts) { /* check if limit reached - realloc */ 
      void *tmp = realloc (fltarr, sizeof *fltarr * nflts * 2); 
      if (!tmp) { /* if realloc fails, use existing data */ 
       fprintf (stderr, "error: realloc memory exhausted.\n"); 
       break; 
      } 
      fltarr = tmp; /* assign realloced block to fltarr */ 
      nflts *= 2; /* update nflts */ 
     } 
     i++; 
    } 

    if (fp != stdin) fclose (fp); /* close input if not stdin */ 

    nflts = i;  /* save number of floats in array as nflts */ 

    for (i = 0; i < nflts; i++) /* output floats in fltarr */ 
     printf (" fltarr[%2zu] : %.2f\n", i, fltarr[i]); 

    free (fltarr); /* free allocated memory */ 

    return 0; 
} 

Beispiel Verwendung/Output

$ ./bin/array_fltdyn dat/fltarr.txt 
fltarr[ 0] : 12.00 
fltarr[ 1] : 12.50 
fltarr[ 2] : 16.30 
fltarr[ 3] : 13.40 
fltarr[ 4] : 17.40 
fltarr[ 5] : 14.30 
fltarr[ 6] : 25.60 
fltarr[ 7] : 25.20 
fltarr[ 8] : 12.50 
fltarr[ 9] : 63.50 

(Anmerkung:. Selten ist die scanf Familie von Funktionen zum Lesen von Datenzeilen empfohlen Dies ist eine Ausnahme, wo man ein festes Format auf jedem garantiert Linie, wo die Verwendung sinnvoll ist.)

Schauen Sie es sich an und lassen Sie mich wissen, wenn Sie weitere Fragen haben. (B.S. Aero `89 TAMU)

+0

Schön gemacht. Gute Verwendung von 'realloc()'. – chux

+0

Selbst ein blindes Eichhörnchen findet ab und zu eine Nuss ... Danke ':)' –

1

Ich hoffe, das hilft Ihnen.

#include <stdio.h>  
#define MAX_LEN 10000 
#define FILE_NAME "your-file-path" 
int main() 
{ 
    double array[MAX_LEN]; 
    FILE *fp= fopen(FILE_NAME, "r"); 
    if(!fp) 
    { 
     perror("Can Not Open The File"); 
     return 1; 
    } 
    int i = 0; 
    while (fscanf(fp, "%lf", &array[i++]) != EOF) 
    { 
     if(i == MAX_LEN) 
     { 
      printf("The file is huge, you should define larger array"); 
      break; 
     } 
    } 
    int j = 0; 
    while(j < i) 
     printf("%d: %lf\n", j, array[j++]);  
} 
+0

1) Aus mit 1. 'i ++' sollte in 'while()' loop sein. 2) 'fscanf (fp,"% lf ", & array [i ++]) == 1 'ist besser. Bei nicht numerischer Eingabe hat der Code UB. Besser früh aufhören – chux

2

Sie können scanf verwenden, um jede der Zahlen zu lesen (bis Sie das Ende der Datei erreichen). Sie benötigen eine dynamische Speicherzuweisung, da Sie die Anzahl der Floats in der Datei nicht im Voraus kennen. Das folgende Beispiel öffnet eine Datei namens "filename" und macht genau das, was Sie wollen.

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

int main(void) 
{ 
    FILE *in; 

    size_t count = 0; 
    size_t array_size = 16; 
    double *array; 

    in = fopen("filename", "r"); 
    if (!in) 
     return -1; 

    array = malloc(array_size * sizeof(*array)); 
    if (!array) 
    { 
     fclose(in); 
     return -1; 
    } 

    while (fscanf(in, "%lf", array + count) == 1) 
    { 
     count += 1; 
     if (count == array_size) 
     { 
      double *temp; 

      array_size *= 2; 
      temp = realloc(array, array_size); 
      if (!temp) 
      { 
       free(array); 
       fclose(in); 
       return -1; 
      } 
      array = temp; 
     } 
    } 

    free(array); 
    fclose(in); 

    return 0; 
} 
+1

Schöne Verwendung von 'realloc()' hier. Ein guter Weg zu gehen. (Kleiner Hinweis auf Erfolg oder Misserfolg) Vergleich mit '== 1' besser als'! = EOF' (Endlosschleife bei nicht numerischer Eingabe) – chux