处理我必须拥有生成数字的文件的项目。第一行是生成的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读取。但是,是的。 如果我需要更多细节或需要在任何地方更清楚,请告诉我
答案 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;
}
请注意,我保留了您的语义:文件开头的随机数不是后面的浮点值数。我怀疑它应该是?