Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/10.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 - Fatal编程技术网

C 读取文件时,每隔一行打印一个空行

C 读取文件时,每隔一行打印一个空行,c,C,在我的.txt文件中,我有以下数据 名称:名称 分数:0.00% 名称:名称 分数:0.00% 名称:名称 得分:6.67% 我试着用这个代码 if (userAnswer1 == 3){ printf("Test History\n\n"); FILE * fPointer; fPointer = fopen("history.txt", "r"); char singleLine[50]; while(!

在我的.txt文件中,我有以下数据

名称:名称
分数:0.00%
名称:名称
分数:0.00%
名称:名称
得分:6.67%

我试着用这个代码

    if (userAnswer1 == 3){
        printf("Test History\n\n");
        FILE * fPointer;
        fPointer = fopen("history.txt", "r");
        char singleLine[50];
        while(!feof(fPointer)) {
            fgets(singleLine, 50, fPointer);
            puts(singleLine);
            int i;
            for(i=0; i>=0; i++){
                if(i%2==0){
                    printf("\n");
                }
                break;
            }
        }
        fclose(fPointer);
    }
要获得此输出,请执行以下操作:

名称:名称
分数:0.00%

名称:名称
分数:0.00%

名称:名称
得分:6.67%

相反,我得到了低于输出的结果

测试历史

姓名:姓名

分数:0.00%

姓名:姓名

分数:0.00%

姓名:姓名

得分:6.67%

分数:6.67%

两件事:函数写换行符;这些函数可以在缓冲区中包括换行符

这意味着当您打印
singleLine
时,首先会有一个换行符(因为
fgets
将其放在那里),然后
put
会编写自己的换行符

删除
fgets
写入缓冲区的换行符,或者不使用
put

while(!feof(fPointer)){
    fgets(singleLine, 50, fPointer);
    puts(singleLine);
    int i;
    for(i=0; i>=0; i++){
        if(i%2==0){
            printf("\n");
        }
        break;
    }
}
有几件事需要注意:

  • 读取直到换行,并将其包含到缓冲区中。因此,在下面的调用中,您已经输出了一个换行符,并且
    put()
    甚至自己添加了一个换行符

  • 考虑以下代码:

    int i;
    for(i=0; i>=0; i++){
        if(i%2==0){
            printf("\n");
        }
        break;
    }
    
    你实际上是在打印一行新行,然后打破循环。所以它和平原没有区别

    printf("\n");
    
  • 将以上两项计算在内,实际上在循环时,您每
    打印3行换行符:一行是
    fgets()
    写入缓冲区的内容,一行来自
    put()
    ,一行手动

    要修复它们,您需要做两项工作:

  • fgets()
    提供的任何内容中删除换行符:

    singleLine[strlen(singleLine) - 1] = '\0';
    
  • 使循环工作得更好:

    int i = 0; // Must initialize!
    while (condition) {
        other_statements;
    
        i++;
        if (i%2==0) {
            printf("\n");
        }
        // Do nothing if 'i' is odd
    }
    
  • 当(!feof())
  • 时停止使用
    。改为检查
    fgets
    的返回值:

    char *ret = fgets( ... );
    if (ret == NULL)
        break;
    

    问题在于您的逻辑-您的'if'在'while'中,因此它循环并计数每个'while'(文件中的行)

    我不是c语言专家,所以没有代码,但似乎你掌握了命令。我将使用的逻辑是查找行中的文本并从中添加“\n”

    i、 e


    添加\n

    这是无法复制的。任何地方都没有安德烈。请创建。请花一些时间阅读“for(i=0;i>=0;i++)”??这种情况是否不总是正确的(至少在包装前)?哦。。它类似于(;),但需要更多的输入:)@MartinJames即使它包装了,它也是。好的,所以我尝试了这个,但它现在除了空行之外不会打印任何东西。我猜单线[strlen(singleLine)-1]='\0';似乎把它全部去掉了,所以我更接近一个解决方案,int i=0;而(!feof(fPointer)){fgets(singleLine,50,fPointer);printf(“%s”,singleLine);i++;if(i%2==0){printf(“\n”);}这似乎有效,只是它再次打印出最后的分数;“分数:6.67%”@andre2012在(!feof())
    时不要使用
    。请检查
    fgets
    的返回值。感谢您的帮助,我并不真正理解,但youtube上的checket教程如果正确,将在回复中发布代码。@andre2012您不理解哪部分?
        printf("Test History\n\n");
    
        FILE *pToFile = fopen("history.txt", "r");
    
        char input[50];
        int i=0;
        while(fgets(input, 50, pToFile)){
            printf("%s", input);
            i++;
            if(i%2==0){
                printf("\n");
            }
        }
        fclose(pToFile);
    
        printf("Test History\n\n");
    
        FILE *pToFile = fopen("history.txt", "r");
    
        char input[50];
        int i=0;
        while(fgets(input, 50, pToFile)){
            printf("%s", input);
            i++;
            if(i%2==0){
                printf("\n");
            }
        }
        fclose(pToFile);