我正在程序的一部分上,我必须从创建的.dat文件读取双打,该文件包含12个双打,如下所示:
10.0
20.0
30.0
40.0
50.0
60.0
70.0
80.0
90.0
100.0
110.0
120.0
这是我的代码:
double readSales(FILE *input, double sales[])
{
int count = 0, n;
double s;
n = fscanf(input, "%lf", &s);
sales[0] = s;
while(n == 1)
{
n = fscanf(input, "%lf", &s);
count++;
sales[count] = s;
}
}
这很好用,但由于必须声明数组的第一个元素,因此我认为它写得不好。问题是没有声明,我只是得到0.0作为数组的第一个元素。谢谢您的反馈。
答案 0 :(得分:1)
您在检查输入是否有效之前正在写入数组。我建议
int readSales(FILE *input, double sales[]) // change the type
{
int count = 0;
double s;
while(fscanf(input, "%lf", &s) == 1)
{
sales[count] = s;
count++;
}
return count; // number of elements
}
答案 1 :(得分:0)
这是我提出的实现此目标的一种方法。我包括了main()
。
#include <stdio.h>
size_t readSales( FILE *input, double sales[],
const size_t salesSize )
{
if ( ! input || ! sales ) { return 0; }
size_t numRead = 0;
while ( numRead < salesSize &&
fscanf( input, "%lf", sales++ ) ) numRead++;
return numRead;
}
int main( int argc, char* argv[] )
{
double d[12];
FILE* fp = fopen( "sales.txt", "r" );
if ( ! fp )
{
printf( "No sales.txt\n" );
return 1;
}
size_t numRead = readSales( fp, d, sizeof d / sizeof( *d ) );
for ( int i = 0; i < numRead; ++i )
{
printf( "%f\n", d[i] );
}
fclose( fp );
return 0;
}
为避免缓冲区溢出,将数组的大小作为readSales()
的参数是一个好主意,因此我已经对readSales()
签名进行了修改。
进行输入验证以确保安全。
此答案解决了您在原始问题中所说的主要问题:即避免初始化数组的第0个元素。您是正确的,该任务是不必要的。