C:文件操作可以';我不知道如何通过文件操作简化这段代码
我一直在写这段代码,但我找不出哪里出了问题。 此程序确实编译并运行,但最终出现致命错误 程序读取一个文件并收集数字以计算总数(在将其转换为浮点值后)。然后读取文件并显示小于10.00的文件 我有一个名为myFile.txt的文件,包含以下内容: 詹姆斯----07.50安东尼----17.00 所以显示器应该是C:文件操作可以';我不知道如何通过文件操作简化这段代码,c,scanf,fseek,C,Scanf,Fseek,我一直在写这段代码,但我找不出哪里出了问题。 此程序确实编译并运行,但最终出现致命错误 程序读取一个文件并收集数字以计算总数(在将其转换为浮点值后)。然后读取文件并显示小于10.00的文件 我有一个名为myFile.txt的文件,包含以下内容: 詹姆斯----07.50安东尼----17.00 所以显示器应该是 总数是24.50 以下是小于10.00的一个: 詹姆斯,他得了07.50分 代码如下: int main() { int n =2, valueTest=0,count=0;
int main()
{
int n =2, valueTest=0,count=0;
FILE* file = NULL;
float temp= 00.00f, average= 00.00f, flTen = 10.00f;
float *totalNote = (float*)malloc(n*sizeof(float));
int position = 0;
char selectionNote[5+1], nameBuffer[10+1], noteBuffer[5+1];
file = fopen("c:\\myFile.txt","r");
fseek(file,10,SEEK_SET);
while(valueTest<2)
{
fscanf(file,"%5s",&selectionNote);
temp = atof(selectionNote);
totalNote[position]= temp;
position++;
valeurTest++;
}
for(int counter=0;counter<2;counter++)
{
average += totalNote[counter];
}
printf("The total is : %f \n",average);
rewind(file);
printf("here is the one with less than 10.00 :\n");
while(count<2)
{
fscanf(file,"%10s",&nameBuffer);
fseek(file,10,SEEK_SET);
fscanf(file,"%5s",¬eBuffer);
temp = atof(noteBuffer);
if(temp<flTen)
{
printf("%s who has %f\n",nameBuffer,temp);
}
fseek(file,1,SEEK_SET);
count++;
}
fclose(file);
intmain()
{
int n=2,valueTest=0,count=0;
FILE*FILE=NULL;
浮子温度=00.00f,平均温度=00.00f,浮子温度=10.00f;
float*totalNote=(float*)malloc(n*sizeof(float));
int位置=0;
char selectionNote[5+1],nameBuffer[10+1],noteBuffer[5+1];
file=fopen(“c:\\myFile.txt”、“r”);
fseek(文件,10,搜索集);
而(valueTest您没有提到您使用的是什么平台和编译器。我将猜测MSVC和Windows,因为您的文件名使用的是Windows样式的路径
您说代码可以编译并运行,但您是否打开了编译器中的警告?这可能会为您提供更多关于可能正在执行的错误操作的线索
在修复了一些打字错误并添加了标准的include头之后,我在gcc中编译了您的代码,其中警告了fscanf
格式字符串和参数之间的不匹配。特别是,您正在传递一个指向char
数组的指针,这不是您的意思。您可能需要阅读有关数组和指针的内容在C语言中,例如在中。该文档中的其余条目也非常有启发性。最有可能的是,您的致命错误来自该语句
fscanf(file,"%5s",&selectionNote);
通常,数组类型的表达式(如selectionNote
)将隐式转换为指针类型(参见注释1),因此在这种情况下,&
是不必要的:
fscanf(file, "%5s", selectionNote);
您没有解释代码应该做什么,所以我不确定如何告诉您如何重构它
除非它是sizeof
运算符或一元&
运算符的操作数,或者是用于初始化数组的字符串文字,否则类型为“类型的数组”的表达式将转换为类型为“指向类型的指针”的表达式,该表达式指向数组对象的初始元素,并且不是数组n左值。如果数组对象具有寄存器存储类,则行为未定义。--C语言标准(草案),第6.3.2.1节,第3段
使用带有适当格式字符串(%f
)的单个fscanf
),而不是使用fscanf
,然后再使用atof
:
您可以使用fscanf
中的返回值来终止循环,而不是使用变量valueTest
和常量2
:
while(fscanf(file, "%f", &totalNote[position]) != 0)
...
从文件读取的第一个循环必须扫描名称和数字,即使您只需要数字
您可以在读取数字的同一个循环中累加数字。如果这样做,您可以删除数组totalNote
(如果您认为您将扩展代码以使用数字执行其他操作,而不仅仅是计算总数,则此“简化”不适用)
读取文件的第二个循环(倒带后的循环)最好用for
表示,而不是while
:
for (count = 0; count < counter; count++)
...
哦,是的,好的,我会调查的。对不起,我刚刚添加了这个计划的目的。我现在正在调查,谢谢你指出这一点!
for (count = 0; count < counter; count++)
...
fscanf(file,"%10s",&nameBuffer);
strtok(nameBuffer, "-");