Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
逐行读取c语言中的文件_C_String_File_Lines - Fatal编程技术网

逐行读取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("

伙计们,我有一个文件,里面有很多行,比如“游戏: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 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);