逐行读取c语言中的文件
伙计们,我有一个文件,里面有很多行,比如“游戏:1 Bob(@)-404”,玩家的名字是Bob,他的最高分数是404,有很多行是这样的。基本上,我必须阅读每一行,看看谁的分数最高,然后用c打印他的名字和分数。到目前为止,我有:逐行读取c语言中的文件,c,string,file,lines,C,String,File,Lines,伙计们,我有一个文件,里面有很多行,比如“游戏:1 Bob(@)-404”,玩家的名字是Bob,他的最高分数是404,有很多行是这样的。基本上,我必须阅读每一行,看看谁的分数最高,然后用c打印他的名字和分数。到目前为止,我有: FILE *fp; char * line = NULL; size_t len = 0; size_t read; fp - fopen("Leaderboard.dat", "r"); if (fp == NULL) { printf("
FILE *fp;
char * line = NULL;
size_t len = 0;
size_t read;
fp - fopen("Leaderboard.dat", "r");
if (fp == NULL) {
printf("File empty/unable to open");
}
现在我真的不知道如何正确地执行此操作。此代码应该可以完成此操作, 请注意,它尚未被检查或编译
FILE *fp;
fp = fopen("Leaderboard.dat", "r");
if (fp == NULL) {
printf("File empty/unable to open");
}
char buffer[100];
char name[100];
char winnerName[100];
char code;
char winnerCode;
int maxScore = 0;
while(fgets(buffer,1000,fp)!=NULL)
{
// getting the points from the end of the line
int last = strlen(buffer) -1;
while(isdigit(buffer[last]))
{
last--;
}
int score = atoi(buffer+last+1);
//getting the name from the start of the line
int i = 0;
while(!isdigit(buffer[i]))
{
i++;
}
i ++;
int k=0;
while(!isdigit(buffer[i]))
{
if(isalpha(buffer[i]))
{
name[k++] = buffer[i];
}
if(buffer[i] == '(' )
{
code= buffer[i+1];
}
i++;
}
name[k] = '\0';
// is greater then max
if(score > maxScore)
{
strcpy(winnerName,name);
maxScore = score;
winnerCode=code;
}
}
printf("Name: %s , Code: %c, Score: %d",winnerName,winnerCode,maxScore);
此代码具有未定义的行为<代码>fp-fopen(…)代码>是错误的。还有,你试过什么?。逐行读取文件是一项非常常见的任务,只需通过谷歌搜索即可。你会发现一百万个例子。我似乎无法理解,就像我可以提取行一样,但我似乎无法比较哪一行的分数最高,并打印出那一行的可能的副本。你认为从一个未初始化的
文件*fp
中减去fopen()
会做什么呢?这不是一个简单的方法。您收到了什么错误消息?在调试器下运行它时,您学到了什么?您是否至少可以尝试添加读取文件的行,并可能在读取每行时存储最高评分者的姓名和分数?如果分数代码>在一个循环中while(fgets(line,maxline,fp)!=NULL)
@iharob-我想真正的问题是:你能帮我写一个代码吗?因为我不知道从哪里开始。很确定这不会编译/你为什么认为…?想打赌吗?它直接来自我的nexus手机!我得到的fgets:call的参数太少(while上的错误(fgets(fp,buffer)!=NULL)行哈哈,不,博士,现在很酷,你编辑了!但是,当我运行它时,我会得到:
。最好检查fscanf
是否返回了请求的元素数(在本例中为5),因为fscanf
可能返回一个小于该值的数字(例如,如果不是的话,%d
无法匹配整数等)。此外,缓冲区[0]
的类型为char
,但%c
需要char*
。最后,%s
说明符是无限的,因此存在缓冲区溢出的可能性。
char buffer[100];
char code[4];
char name[100];
int maxScore=0;
char maxName[100];
char maxCode[4];
while(fscanf(fp,"%s %s %s %c %d",buffer,name,code,buffer[0],&score) !=EOF)
{
if(score>maxScore)
{
maxScore=score;
strcpy(maxCode,code);
strcpy(maxName,name);
}
}
printf("Name: %s. Code %s Score %d",maxName,maxCode,maxScore);