C 为什么我的FSF总是跳过随机数?
基本上,我需要扫描这个文件中的所有值…它基本上是这样做的,但它似乎跳过了随机值,所以它最终没有正确排列。这只是我需要做的作业的一部分,所以你不会给出答案,我仍然想自己解决这个问题,只是需要一点帮助来解决这个问题,因为我被卡住了 代码如下:C 为什么我的FSF总是跳过随机数?,c,file-io,scanf,C,File Io,Scanf,基本上,我需要扫描这个文件中的所有值…它基本上是这样做的,但它似乎跳过了随机值,所以它最终没有正确排列。这只是我需要做的作业的一部分,所以你不会给出答案,我仍然想自己解决这个问题,只是需要一点帮助来解决这个问题,因为我被卡住了 代码如下: int main() { FILE *fp; char x[15]; float ID [1000]; int i=0, j=0; float homework [1000]; float lab [1000];
int main()
{
FILE *fp;
char x[15];
float ID [1000];
int i=0, j=0;
float homework [1000];
float lab [1000];
float midterm [1000];
float Final [1000];
int count=0;
char headers[35];
char y;
fp= fopen("lab5_inputFile.txt", "r");
while (fscanf(fp, "%s", x)!=EOF){
if (count > 728){
fscanf(fp, "%f", &ID[i]);
printf("ID : %.1f\n", ID[i]);
fscanf(fp, "%f", &homework[i]);
printf("Homework: %.1f\n", homework[i]);
fscanf(fp, "%f", &lab[i]);
printf("lab: %.1f\n", lab[i]);
fscanf(fp, "%f", &midterm[i]);
printf("Midterm: %.1f\n", midterm[i]);
fscanf(fp, "%f", &Final[i]);
printf("Final: %.1f\n", Final[i]);
i++;
}
count ++;
}
printf("count = %d\n", count);
fclose(fp);
我只扫描了最后几个值,以便于阅读/调试,在实际代码中,我只会跳过标题,在提交之前,我还计划更改很多其他内容,比如我可能使用指针类型和malloc,而不是数组和其他一些内容,但我的主要问题是如何解决从文件读入数组的问题
提前谢谢 您每次都跳过第一行x。您应该将其改写为:
char x[100];
/* while (fscanf(fp, "%s", x)!=EOF){ */
fgets(x, 100, fp); /* Skip first line */
for(; /* ever */; ) {
if(5 == fscanf(fp, "%f%f%f%f%f", &ID[i], &homework[i], &lab[i], &midterm[i], &Final[i])) {
printf("ID : %.1f\n", ID[i]);
printf("Homework: %.1f\n", homework[i]);
printf("lab: %.1f\n", lab[i]);
printf("Midterm: %.1f\n", midterm[i]);
printf("Final: %.1f\n", Final[i]);
i++;
} else break;
}
OP的方法重复读取一组非空白文本,然后读取5个数字。代码应该读一行,扔掉它,然后重复读5组数字 读第一行,然后用fgets读到EOF。用sscanf或strtod扫描缓冲区
@Mohit Jain fscanf返回读取的字符数不正确。fscanf返回已转换或EOF的字段数。养成阅读正在使用的每个函数的文档的习惯,例如。。。。使用所有警告和调试信息gcc-Wall-Wextra-g编译。使用调试器gdb。你不需要问就可以找到你的问题!为什么代码会忽略对fscanf的前728次调用的结果?需要忽略文件的第一行,而不是下面任何一行建议在顶部附近插入fgets;越过第一条线。然后,以下所有对fscanf的调用都需要有一个包含前导“”的格式字符串,因此所有空白都将被占用/跳过。此外,对fscanf的每个调用都需要检查返回值,以确保转换成功,即如果1!=fscanf。。。{//handle error}使用“1”,因为对fscanf的所有调用都只转换一个参数。因此,有必要定义一个结构,该结构包含一个字段,用于从文件中的每一行读取的每个项。然后定义1000个这些结构的数组的实例。这将清理代码,使其更易于遵循,并在以后维护代码中发生的事情。feoffp的方法不正确。OP的文本文件以“\n”结尾,您的答案在以数字结尾的文件中计数。当文件以数字以外的内容结尾时,最后一个fscanf%f,&Final[i];未设置EOF,并且出现额外的5个fscanf。请使用以“\n”结尾的文本文件尝试您的解决方案以查看该问题。测试每个fscanf的结果,而不是iffeoffp,尤其是最后一个fscanf的结果。@chux我尝试读取所有值。如果文件在读取完所有文件后仍不读取eof,我将递增I,声明读取成功。否则,我至少在fscanf上声明失败。虽然OP的调试输出会显示未经验证的声音,就像您没有尝试在建议的输入上运行代码一样。如果成功读取的最后一个数字后面有空格,则feof将不为真,然后下一组5个fscanffp,%f。。。一切都将失败。由于代码未检查fscanf的结果,因此未检测到此失败。在这些失败之后,feof将成为现实。为清楚起见,feof不会通知不再有可用数据,feof通知先前的IO操作检测到不再有可用数据。如果文件在读取所有数据后仍不读取eof,则I增量I是一个问题。1代码不知道单个fscanf是否工作,例如输入了非数字2问题是下一个fscanffp,%f,&ID[i];可能会失败,因为没有更多的数字可读取。该代码未检测到该故障,可在通过iffeoffp break中断前执行5次故障fscanf;建议查看。@chux感谢您共享link.fgets dummy、sizeofdummy、fp将无法按预期工作。sizeofdummy是指针的大小,可能是4或8。建议定义N 1000。。。fgets dummy,N,fp。注意:格式为fscanffp,%f,。。。这是不需要的。这也不是问题。有趣的是,这段代码对studentGrades使用了一个本地数组,对dummy使用了一个分配数组。很高兴能展示各种各样的大型数组定义,否则不清楚为什么这两种方法不同。
char buf[100];
fgets(buf, sizeof buf, fp); // Read and toss first line
i = 0;
while (fgets(buf, sizeof buf, fp) != NULL) { // Read until EOF
if ((i >= 1000) || (sscanf(buf, "%f%f%f%f%f", &ID[i], &homework[i], &lab[i],
&midterm[i], &Final[i]) != 5)) {
fputs("Quit as too many lines or ill formatted\n", stderr);
break;
}
printf("ID : %.1f\n", ID[i]);
printf("Homework: %.1f\n", homework[i]);
printf("lab: %.1f\n", lab[i]);
printf("Midterm: %.1f\n", midterm[i]);
printf("Final: %.1f\n", Final[i]);
i++;
}
#include <stdio.h>
#include <stdlib.h>
struct grade
{
float ID;
float homework;
float lab;
float midterm;
float final;
};
#define ARRAYSIZE (1000)
int main()
{
FILE *fp;
struct grade studentGrades[ARRAYSIZE] = {{0},{0},{0},{0},{0}};
int i=0;
int count=0;
if( NULL == (fp= fopen("lab5_inputFile.txt", "r") ) )
{
perror( "fopen for read of lab5_inputFile.txt" );
exit(1);
}
// implied else fopen successful
char* dummy = malloc(1000*sizeof(char) );
if( NULL == dummy )
{
perror( "malloc for dummy buffer" );
exit(2);
}
// implied else, malloc successful
char * firstLine = fgets( dummy, sizeof(dummy), fp ); // step past first line of file
if( NULL == firstLine )
{
perror( "fget of first line of file" );
exit(3);
}
// implied else, fgets successful
free( dummy );
int itemCount = 0;
for ( i = 0; i < ARRAYSIZE; i++ )
{
itemCount = fscanf(fp, " %f", &studentGrades[i].ID);
if( EOF == itemCount ) // Note:making assumption that every line,
// after first, is properly formatted
{
break; // exit for loop
}
if( 1 != itemCount )
{
perror("fscanf");
exit(4);
}
// implied else read of ID successful, not end of file
printf("ID : %.1f\n", studentGrades[i].ID);
if( 1 != fscanf(fp, " %f", &studentGrades[i].homework) )
{
perror( "fscanf of homework");
exit(5);
}
// implied else, read of homework successful
printf("Homework: %.1f\n", studentGrades[i].homework);
if( 1 != fscanf(fp, " %f", &studentGrades[i].lab) )
{
perror( "fscanf of lab" );
exit(6);
}
// implied else, read of lab successful
printf("lab: %.1f\n", studentGrades[i].lab);
if( 1 != fscanf(fp, " %f", &studentGrades[i].midterm) )
{
perror( "fscanf of midterm" );
exit(7);
}
// implied else, read of midterm successful
printf("Midterm: %.1f\n", studentGrades[i].midterm);
if( 1 != fscanf(fp, " %f", &studentGrades[i].final) )
{
perror( "fscanf of final" );
exit(8);
}
// implied else, read of final successful
printf("Final: %.1f\n", studentGrades[i].final);
count ++;
} // end for
printf("count = %d\n", count);
fclose(fp);
return(0);
}