2016-10-31 6 views
1

Arbeiten an einem Projekt, wo ich eine Datei haben muss, die Zahlen generiert wird. Die erste Zeile ist ein generierter Int. Gefolgt von einem Schwimmer (separate Linien). (Ich mache es getrennte Zeilen, weil ich denke, dass es mehr Sinn macht, da ich es auf zwei verschiedene Arten für die Bin-Packing-Probleme lesen muss, für die ich das brauche ... Wie eine Art, eine nach der anderen zu lesen und eine andere sie zu speichern in einem Array .. Aber wollen Sie zuerst auf diese) Get ein Seg Fehler, wenn ich versuche, meine Datei für einen Float nach dem Lesen eines int zu lesen. Edit: Fehler tritt in ReadOffline auf.Fscanf Seg Fehler

int randomFunction() 
{ 
    FILE *fp; 
    int i; 
    fp = fopen("theItems.txt", "w"); 
    if (fp == NULL) 
    printf("Error: file can't be opened.\n"); 

    srand(time(NULL)); 
    int random_number = rand(); 
    printf("Random Number %d\n", random_number); 
    fprintf(fp,"%d",random_number); 
    fclose(fp); 
    fp = fopen("theItems.txt", "a"); 
    int numberOfItems = rand(); 
    printf("NumberOfItems: %d\n",numberOfItems); 
    for(i = 0; i < 10; i++) 
    { 
    fp = fopen("theItems.txt", "a"); 
    float number = (float)rand()/(float)(RAND_MAX); 
    fprintf(fp,"%f",number); 
    fprintf(fp,"%s", "\n"); 
    fclose(fp); 
    } 
    return numberOfItems; 
} 

void readOffline(int numberOfItems) 
{ 
    FILE *fp; 
    int n = 0,i; 
    float nu = 0.00; 
    fp = fopen("theItems.txt", "r"); 
    if (fp == NULL) 
    printf("Error: file can't be opened.\n"); 

    fseek(fp,SEEK_SET,0); 
    fscanf(fp,"%d",&n); 
    printf("Number read: %d\n", n); 
    float array[numberOfItems]; 
    // for(i = 0; i < 3; i++) 
    // { 
fscanf(fp,"%f",&nu); 
    // array[i] = nu; 
    // } 
fclose(fp); 
printf("Int:%d\n", n); 
int j; 
// for(j = 0; j < 3; j++) 
// printf("Float Number:%f\n", array[j]); 
} 
int main() 
{ 

    int numberOfItems = randomFunction(); 
    readOffline(numberOfItems); 
    return 0; 
} 

Ich versuche nur, ein Verständnis zu bekommen, warum es einen seg Fehler verursacht, wenn ich es // out ich es mein int zu lesen bekommen kann, aber manchmal ist es nicht die richtige lesen Int. Aber ja. Bitte lassen Sie mich wissen, wenn ich weitere Details brauche oder überall klarer sein muss

+0

'float-array [numberOfItems];' wird durch 'int numberOfItems = rand();' Es gibt keinen Code, der 'numberOfItems' davon abhält, 0 oder wahnsinnig groß zu sein. Schlagen Sie 'numberOfItems = rand()% 10 + 1;' – chux

+0

Wie groß ist 'numberofItems'. Wenn es zu groß ist, werden Sie das Limit für die Größe von automatischen Arrays erreichen. – Barmar

+0

Das funktionierte chux. Vielen Dank! – anchorman

Antwort

0

Sie haben mehrere Probleme in Ihrem Code:

  • Sie öffnen die Ausgabedatei mehrere Male in randomFunction(), Sie auch einen Stream Griff auslaufen und es offen lassen.

  • Sie beenden die Funktion nicht, wenn NULL zurückgibt. Der Rest des Codes ruft undefiniertes Verhalten auf, wenn fp == NULL. Das gleiche Problem ist in readOffline() vorhanden: Wenn fp == NULL, sollten Sie sofort von der Funktion zurückkehren.

  • Sie geben keinen Zeilenvorschub nach der ersten Zufallszahl in der Ausgabedatei aus.

  • Sie geben immer 10 Zufallszahlen aus.

  • Am wichtigsten: die von randomFunction() zurückgegebene Zufallszahl ist potenziell riesig, die Zuweisung eines Arrays mit lokalem Speicher, der größer als ein paar Megabyte ist, verursacht wahrscheinlich undefiniertes Verhalten. Versuchen Sie und reduzieren Sie die maximale zufällige Anzahl von Werten.

Hier ist eine vorgeschlagene Korrektur:

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

int randomFunction(void) { 
    FILE *fp; 
    int i; 
    fp = fopen("theItems.txt", "w"); 
    if (fp == NULL) { 
     printf("Error: file can't be opened.\n"); 
     return -1; 
    } 

    srand(time(NULL)); 
    int random_number = rand(); 
    printf("Random Number %d\n", random_number); 
    fprintf(fp, "%d\n", random_number); 

    int numberOfItems = 1 + rand() % 100; /* between 1 and 100 */ 
    printf("NumberOfItems: %d\n", numberOfItems); 
    for (i = 0; i < numberOfItems; i++) { 
     float number = rand()/(float)(RAND_MAX); 
     fprintf(fp, "%f\n", number); 
    } 
    fclose(fp); 
    return numberOfItems; 
} 

void readOffline(int numberOfItems) { 
    FILE *fp; 
    int n = 0, i; 
    fp = fopen("theItems.txt", "r"); 
    if (fp == NULL) { 
     printf("Error: file can't be opened.\n"); 
     return; 
    } 

    fscanf(fp, "%d", &n); 
    printf("Number read: %d\n", n); 

    float array[numberOfItems]; 
    for (i = 0; i < numberOfItems; i++) { 
     if (fscanf(fp, "%f", &array[i]) != 1) 
      break; 
    } 
    fclose(fp); 
    printf("Int:%d\n", n); 
    for (int j = 0; j < i; j++) { 
     printf("Float Number %d: %f\n", j, array[j]); 
    } 
} 

int main(void) { 
    int numberOfItems = randomFunction(); 
    readOffline(numberOfItems); 
    return 0; 
} 

Beachten Sie, dass ich Ihre Semantik gehalten: die Zufallszahl am Anfang der Datei nicht die Anzahl der Fließkommawerte, die folgen. Ich vermute es sollte sein?

0

Ich würde sagen, dass je nach dem bestimmten Compiler, den Sie verwenden, dies ein Problem bei der Einrichtung der tatsächlichen Array sein könnte. Dies wird (als Beispiel) in Variable Sized Arrays vs calloc in C diskutiert. Aus den Diskussionen sollten Sie Calloc und Free verwenden. Ein weiterer Punkt ist, dass Sie sicherstellen müssen, dass Ihr Wert größer als 3 und nicht zu groß ist. Da sich das Array nur im lokalen Bereich von readOffline() befindet, sollten Sie es nicht mit der Variablen numberOfItems verbinden.

float array[3]; 
    for(i = 0; i < 3; i++) 
    { 
     fscanf(fp,"%f",&nu); 
     array[i] = nu; 
    }