Fscanf Seg错误

时间:2016-10-31 21:25:04

标签: c floating-point segmentation-fault int scanf

处理我必须拥有生成数字的文件的项目。第一行是生成的int。其次是花车(单独的线条)。 (我把它分开来是因为我觉得它更有意义,因为我必须通过两种不同的方式来阅读我需要的bin包装问题...就像一种方法一次读一个而另一种方式将它存储在一个数组中..但是想先把它弄下来) 当我在读取int后尝试读取我的文件以获取浮点数时出现seg错误。编辑:readOffline中发生错误。

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

试图理解为什么它导致了一个seg错误,当我//它出来时我可以让它读取我的int但有时它不是正确的int读取。但是,是的。 如果我需要更多细节或需要在任何地方更清楚,请告诉我

2 个答案:

答案 0 :(得分:0)

我会说,根据您使用的特定编译器,这可能是设置实际数组时的问题。这是Variable Sized Arrays vs calloc in C中讨论的(例如)。从讨论中,你应该使用calloc和free。另一点是你需要确保你的值大于3而不是太大。由于数组仅在readOffline()的本地范围内,因此不应将其连接到变量numberOfItems。

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

答案 1 :(得分:0)

您的代码中存在多个问题:

  • 您在randomFunction()中多次打开输出文件,甚至会泄漏流句柄并将其保持打开状态。

  • fopen()返回NULL时,您不会退出该功能。如果fp == NULL

  • ,其余代码将调用未定义的行为
  • readOffline()中存在同样的问题:if 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;
}

请注意,我保留了您的语义:文件开头的随机数不是后面的浮点值数。我怀疑它应该是?