源代码:
//向文件中写入数据
void fileOperate_Write(FILE *fp)
{
if(fp == NULL)
{
perror("文件打开失败");
exit(EXIT_FAILURE);
}
int arr[10];
for(int i=0;i<10;i++)
{
arr[i] = i*3;
//写入数据
if(fprintf(fp,"%d\n",arr[i])){}
else
{
perror("写入失败");
exit(EXIT_FAILURE);
}
}
}
void fileOperate_Scanf(FILE *fp)
{
int sum = 0;
int arr[10];
int i = 0;
while (i < 10 && fscanf(fp,"%d",&arr[i++]) == 1) //问题出在这个位置!
{
printf("%d\n",arr[i-1]);
sum += arr[i-1];
}
printf("总和:%-2d\n",sum);
}
请考虑以上代码。这是一段文件读取操作代码片段,目的是将文件流指针fp所指向的文件中的数据进行读取并存储到arr数组中,计算总和,并打印读取到的数据。该段代码运行后while循环判断为假,导致循环体内代码不被执行,从而得出非预期结果。
原因分析:
之前的代码进行了文件写入,将数据写入到临时文件之中。当数据写入完成后,文件内部位置指示器停留在了文件末尾,因此当读取时fscanf函数读取不到数据,导致判断为假,从而出现错误。
解决方法就是将文件指针进行重置 或者 将scanf放入循环体中(因为循环体可以更好控制读取过程。如果在循环中读取失败,可以通过逻辑判断决定是否需要重置文件指针或采取其他措施。)
修复后代码:
/*法一:重置指针*/
void fileOperate_Scanf(FILE *fp)
{
int sum = 0;
int arr[10];
int i = 0;
rewind(fp); //将文件指针手动重置
while (i < 10 && fscanf(fp,"%d",&arr[i++]) == 1)
{
printf("%d\n",arr[i-1]);
sum += arr[i-1];
}
printf("总和:%-2d\n",sum);
}
/*法二:放入循环体*/
void fileOperate_Scanf(FILE *fp)
{
int sum = 0;
int arr[10];
int i = 0;
while (i < 10)
{
fscanf(fp,"%d",&arr[i++]);
printf("%d\n",arr[i-1]);
sum += arr[i-1];
}
printf("总和:%-2d\n",sum);
}