当函数 returns 为空时程序崩溃
Program crashes when a function returns empty
我想检查我的预定义数据是否在我拥有的 .dat 文件中。如果是这样,我打印它们。如果不是,我的程序会崩溃,因为我编写的函数与 return.
无关
我该如何解决这个问题?我如何检查是否没有匹配并说 "No match" 并防止我的程序崩溃?
struct objectList 用于我的预定义数据。 struct database 用于.dat文件中的数据。
struct objectList
{
double oArea;
double oLength;
double oFormFactor;
};
struct database
{
char name[15];
double dArea;
double dLength;
double dFormFactor;
};
如果只有 "area"、"length" 和 "formFactor" 匹配,此函数会读取文件和 returns 值。
struct database myReadFile(FILE *rPtr, double area, double length, double formFactor)
{
struct database fromDb = { "", 0.0, 0.0, 0.0 };
if ((rPtr = fopen("objects.dat", "r")) == NULL)
printf("Couldn't open the file to read.\n");
else
{
fscanf(rPtr, "%s%lf%lf%lf", fromDb.name, &fromDb.dArea, &fromDb.dLength, &fromDb.dFormFactor);
while (!feof(rPtr))
{
if (fromDb.dArea == area)
if (fromDb.dLength == length)
if (fromDb.dFormFactor == formFactor)
{
printf("We have found the %s\n", fromDb.name);
return fromDb;
}
fscanf(rPtr, "%s%lf%lf%lf", fromDb.name, &fromDb.dArea, &fromDb.dLength, &fromDb.dFormFactor);
}
}
fclose(rPtr);
}
此函数打印值。
void getValues(FILE *gPtr, double area, double length, double formFactor)
{
struct database objectValues = { "", 0.0, 0.0, 0.0 };
objectValues = myReadFile(gPtr, area, length, formFactor);
printf("Object name: %s\n", objectValues.name);
printf("Object area: %.2lf\n", objectValues.dArea);
printf("Object length: %.2lf\n", objectValues.dLength);
printf("Object formFactor: %.2lf\n", objectValues.dFormFactor);
}
主要内容:
int main()
{
struct objectList myObjectList[4];
myObjectList[0] = { 9214.00, 417.24, 22.08 }; // Coin
myObjectList[1] = { 54375.00, 1087.94, 49.97 }; // mp3
myObjectList[2] = { 12785.00, 550.70, 23.22 }; // toy
myObjectList[3] = { 100.01, 200.02, 300.03 }; // Random stuff
FILE *cfPtr;
if ((cfPtr = fopen("objects.dat", "a +")) == NULL)
printf("Couldn't open the file\n");
else
fclose(cfPtr);
int i = 2;
getValues(cfPtr, myObjectList[i].oArea, myObjectList[i].oLength, myObjectList[i].oFormFactor);
return 0;
}
我的 .dat 文件有 "toy"、"coin"、"mp3",但没有 "random stuff"。所以当 i = 3 时,我的程序崩溃了。
我看到你的代码的主要问题是读取循环,它主要有两个问题
阅读:Why is while (!feof(rPtr)) always wrong.
必须检查scanf()
的return值,防止scanf()
溢出目标缓冲区,所以循环条件应该是
while (fscanf(rPtr, "%14s%lf%lf%lf", fromDb.name, &fromDb.dArea,
&fromDb.dLength, &fromDb.dFormFactor) == 4)
这个怎么样
int
myReadFile(struct database *db, double area, double length, double formFactor)
{
FILE *rPtr;
if ((rPtr = fopen("objects.dat", "r")) == NULL)
printf("Couldn't open the file to read.\n");
else
{
while (fscanf(rPtr, "%14s%lf%lf%lf", db->name, &db->dArea,
&db->dLength, &db->dFormFactor) == 4)
{
if ((db->dArea != area) || (db->dLength != length) ||
(db->dFormFactor != formFactor))
{
continue;
}
fclose(rPtr);
return 0;
}
}
fclose(rPtr);
return -1;
}
并且在主函数中
struct database result;
if (getValues(&result, myObjectList[i].oArea,
myObjectList[i].oLength, myObjectList[i].oFormFactor) == 0)
{
fprintf(stderr, "%s\n", result.name);
}
我想检查我的预定义数据是否在我拥有的 .dat 文件中。如果是这样,我打印它们。如果不是,我的程序会崩溃,因为我编写的函数与 return.
无关我该如何解决这个问题?我如何检查是否没有匹配并说 "No match" 并防止我的程序崩溃?
struct objectList 用于我的预定义数据。 struct database 用于.dat文件中的数据。
struct objectList
{
double oArea;
double oLength;
double oFormFactor;
};
struct database
{
char name[15];
double dArea;
double dLength;
double dFormFactor;
};
如果只有 "area"、"length" 和 "formFactor" 匹配,此函数会读取文件和 returns 值。
struct database myReadFile(FILE *rPtr, double area, double length, double formFactor)
{
struct database fromDb = { "", 0.0, 0.0, 0.0 };
if ((rPtr = fopen("objects.dat", "r")) == NULL)
printf("Couldn't open the file to read.\n");
else
{
fscanf(rPtr, "%s%lf%lf%lf", fromDb.name, &fromDb.dArea, &fromDb.dLength, &fromDb.dFormFactor);
while (!feof(rPtr))
{
if (fromDb.dArea == area)
if (fromDb.dLength == length)
if (fromDb.dFormFactor == formFactor)
{
printf("We have found the %s\n", fromDb.name);
return fromDb;
}
fscanf(rPtr, "%s%lf%lf%lf", fromDb.name, &fromDb.dArea, &fromDb.dLength, &fromDb.dFormFactor);
}
}
fclose(rPtr);
}
此函数打印值。
void getValues(FILE *gPtr, double area, double length, double formFactor)
{
struct database objectValues = { "", 0.0, 0.0, 0.0 };
objectValues = myReadFile(gPtr, area, length, formFactor);
printf("Object name: %s\n", objectValues.name);
printf("Object area: %.2lf\n", objectValues.dArea);
printf("Object length: %.2lf\n", objectValues.dLength);
printf("Object formFactor: %.2lf\n", objectValues.dFormFactor);
}
主要内容:
int main()
{
struct objectList myObjectList[4];
myObjectList[0] = { 9214.00, 417.24, 22.08 }; // Coin
myObjectList[1] = { 54375.00, 1087.94, 49.97 }; // mp3
myObjectList[2] = { 12785.00, 550.70, 23.22 }; // toy
myObjectList[3] = { 100.01, 200.02, 300.03 }; // Random stuff
FILE *cfPtr;
if ((cfPtr = fopen("objects.dat", "a +")) == NULL)
printf("Couldn't open the file\n");
else
fclose(cfPtr);
int i = 2;
getValues(cfPtr, myObjectList[i].oArea, myObjectList[i].oLength, myObjectList[i].oFormFactor);
return 0;
}
我的 .dat 文件有 "toy"、"coin"、"mp3",但没有 "random stuff"。所以当 i = 3 时,我的程序崩溃了。
我看到你的代码的主要问题是读取循环,它主要有两个问题
阅读:Why is while (!feof(rPtr)) always wrong.
必须检查
scanf()
的return值,防止scanf()
溢出目标缓冲区,所以循环条件应该是while (fscanf(rPtr, "%14s%lf%lf%lf", fromDb.name, &fromDb.dArea, &fromDb.dLength, &fromDb.dFormFactor) == 4)
这个怎么样
int
myReadFile(struct database *db, double area, double length, double formFactor)
{
FILE *rPtr;
if ((rPtr = fopen("objects.dat", "r")) == NULL)
printf("Couldn't open the file to read.\n");
else
{
while (fscanf(rPtr, "%14s%lf%lf%lf", db->name, &db->dArea,
&db->dLength, &db->dFormFactor) == 4)
{
if ((db->dArea != area) || (db->dLength != length) ||
(db->dFormFactor != formFactor))
{
continue;
}
fclose(rPtr);
return 0;
}
}
fclose(rPtr);
return -1;
}
并且在主函数中
struct database result;
if (getValues(&result, myObjectList[i].oArea,
myObjectList[i].oLength, myObjectList[i].oFormFactor) == 0)
{
fprintf(stderr, "%s\n", result.name);
}