【发布时间】:2012-02-20 21:11:29
【问题描述】:
我有这个防御性编程问题,我真的不知道如何解决。
我有这个函数,它将文件路径和表的大小(行/列计数)作为参数,我正在寻找更好的方法来验证输入文件。我假设这个函数的参数总是正确的。 size 表示存储在文件中的表的“较小的一侧”:
例如:
1 2 3 4
5 6 7 8
大小 = 2 是正确的,而
1 2 3 4 5
5 6 7 8 9
大小 = 2 不正确
我也希望能够拒绝这样的文件
1 2 3 4 5 6 7 8
size = 2(通过 fscanf 接受)
我希望能够拒绝的另一种文件类型是
1 2 3
4 5 6
大小 = 2
目前我唯一的安全措施是检查文件的元素是否真的是数字。
这是我到目前为止所做的代码:
void import(float** table, int size, char* path)
{
FILE* data = fopen(path, "r");
assert(data);
int i,j;
int st;
for (i=0; i<size; i++)
{
for(j=0; j<(size*2)-1; j++)
{
st = fscanf(data, "%f", &table[i][j]);
if (!st)
{
printf("Error while importing the file.\n");
fclose(data);
return -1;
}
}
}
fclose(data);
}
我真的不知道从哪里开始以及如何开始,我不是很精通 C,似乎存在很多功能和机制来做我想做的事,但它们看起来都非常复杂,有些实际上比我提供的代码。
如果有人能指出我正确的方向,那就太好了。
【问题讨论】:
-
"number = 2"是什么意思?
-
我想我不明白正确的文件是什么样的。我只能看到
2永远是对的。 -
@LihO 输入的数字,就是代码里的大小
-
这绝对是assert的错误使用方式。 assert 不是用于错误检查,而是用于逻辑一致性。换句话说,你可以这样写: data = open( ... ); if( data == NULL ) { ... } assert( data != NULL );,但是打开后调用 assert 是无效的错误检查。
-
@Sword22 你被告知错了。你应该经常检查你的 malloc 和你的文件打开,但你不应该用 assert 这样做。断言用于说明逻辑必要性或参数假设。 (例如, int foo( int *x ) { assert( x ) ... } 说明 foo 不能用 NULL 指针调用。)
标签: c file input defensive-programming