2016-10-31 2 views
1

Работа над проектом, где у меня должен быть файл, который генерирует числа. Первая строка - это сгенерированный int. Далее следуют поплавки (отдельные строки). (Я делаю это отдельные строки, потому что я чувствую, что это имеет больше смысла, поскольку я должен прочитать два разных способа для проблем с упаковкой ящиков, которые мне нужны для этого ... Как один из способов чтения по одному, а другой - в массиве. Но сначала хочу получить это) Получение seg-сбоя, когда я пытаюсь прочитать мой файл для float после прочтения int. Изменить: ошибка возникает в readOffline.Fscanf Seg Error

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; 
} 

Просто пытаюсь получить понимание, почему это вызывает ошибку, когда я сегмы // это я могу получить его, чтобы прочитать мою Int, но иногда это не право Int читать. Но да. Пожалуйста, дайте мне знать, если мне нужна дополнительная информация или вам нужно быть более ясным где-нибудь

+0

'float array [numberOfItems];' устанавливается 'int numberOfItems = rand();' Нет кода, чтобы 'numberOfItems' не был 0 или безумно большим. Предложить 'numberOfItems = rand()% 10 + 1;' – chux

+0

Насколько велика 'numberofItems'. Если он слишком велик, вы достигнете предела в размере автоматических массивов. – Barmar

+0

Это сработало. Благодаря! – anchorman

ответ

0

У вас есть несколько вопросов, в вашем коде:

  • Вы открыть выходной файл несколько раз в randomFunction(), вы даже просочиться потоковой ручкой и оставить его открытым.

  • Вы не выходите из функции, когда fopen() возвращает NULL. Остальная часть кода вызывает неопределенное поведение, если fp == NULL.

  • та же проблема есть в readOffline(): если fp == NULL, вы должны немедленно вернуться из функции.

  • Вы не выводите строку после первого случайного числа в выходном файле.

  • Вы всегда выдаете 10 случайных чисел.

  • Самое главное: случайное число, возвращаемое randomFunction(), потенциально огромно, выделение массива с локальным хранилищем, превышающим несколько мегабайт, может вызвать неопределенное поведение. Попробуйте уменьшить максимальное случайное число значений.

Вот предлагаемая поправка:

#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; 
} 

Обратите внимание, что я вся свою семантику: случайное число в начале файла не число значений с плавающей запятой, которые следуют. Я подозреваю, что это должно быть?

0

Я бы сказал, что в зависимости от конкретного используемого компилятора, это может быть проблемой при настройке фактического массива. Это (в качестве примера) обсуждается в Variable Sized Arrays vs calloc in C. Из обсуждений вы должны использовать calloc и бесплатно. Другое дело, что вам нужно убедиться, что ваше значение больше 3 и не слишком велико. Поскольку массив находится только в локальной области readOffline(), вы не должны подключать его к переменной numberOfItems.

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