【问题标题】:Fscanf Seg ErrorFscanf 段错误
【发布时间】:2026-01-27 11:45:02
【问题描述】:

在我必须有一个生成数字的文件的项目上工作。第一行是一个生成的 int。后跟一个浮点数(单独的行)。 (我这样做是分开的,因为我觉得它更有意义,因为我必须以两种不同的方式阅读它来解决我需要的垃圾箱包装问题......就像一次阅读一种方式,另一种方式存储它在一个数组中..但想先把它弄下来) 在读取 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 读取。但是,是的。 如果我需要更多详细信息或需要在任何地方更清楚,请告诉我

【问题讨论】:

  • float array[numberOfItems]; 是由 int numberOfItems = rand(); 设置的,没有代码可以防止 numberOfItems 为 0 或异常大。建议numberOfItems = rand()%10 + 1;
  • numberofItems 有多大。如果它太大,您将达到自动数组大小的限制。
  • 那行得通 chux 。谢谢!

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


【解决方案1】:

您的代码中有多个问题:

  • 您在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;
}

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

【讨论】:

    【解决方案2】:

    我会说,根据您使用的特定编译器,这可能是设置实际数组时的问题。这是(作为示例)在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;
       }   
    

    【讨论】: