【问题标题】:How to correctly display edited file output?如何正确显示编辑后的文件输出?
【发布时间】:2019-07-27 20:08:30
【问题描述】:

我正在尝试制作一个字符生成器/编辑器,并且我想在控制台屏幕上显示所有已保存字符的列表。

我设法让列表正常工作,但输出有一点问题。

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

void main(){
    CreateDirectory("Characters",NULL);
    CreateDirectory("Characters\\some random name",NULL);
    CreateDirectory("Characters\\another random name",NULL);
    system("dir /b/aD \Characters > character_list.txt");

    FILE *f;

    char Name[50];
    int c, i=1;

    f = fopen("character_list.txt", "r");
        if(f == NULL){
            printf("Could not open character list");
            return;
        }
        printf("Choose character to edit:\n1) ");
        if(f)
            while((c=getc(f)) != EOF){
                if(c=='\n'){
                    putchar(c);
                    printf("%d) ", ++i);
                }
                else putchar(c);
            }
    fclose(f);
    return;
}

对于两个创建的字符,输出如下所示:

Choose character to edit:
1) some random name
2) another random name
3)

这就是问题所在。如何删除最后一点,使其看起来像这样?

Choose character to edit:
1) some random name
2) another random name

【问题讨论】:

  • 您是否想过循环使用fgets 从文件中读取完整行而不是检查新行?

标签: c file-io output


【解决方案1】:

换行符终止当前行,并不意味着后面会出现更多字符。所以你得到了“空”3),因为在最后一个新行之后没有更多的字符可以读取。 所以我要引入一个变量来指示计数器%d) 是否应在下一次运行中打印(即仅当后面有更多字符时):

        int beginOfNewLine = 1;
        while((c=getc(f)) != EOF){
            if (beginOfNewLine) {
                printf("%d) ", ++i);
                beginOfNewLine = 0;
            }
            if(c=='\n'){
                beginOfNewLine = 1;  // trigger to print the counter in the next run
            }
            putchar(c);
        }

【讨论】:

    【解决方案2】:

    如何删除最后一个点,使其[不写空最后一行]?

        while((c=getc(f)) != EOF){
            if(c=='\n'){
                putchar(c);
                printf("%d) ", ++i);
            }
            else putchar(c);
        }
    
        bool emptyline = true;
        while ((c = getc(f)) != EOF) {
            if (emptyline) {
                printf("%d) ", ++i);
                emptyline = false;
            }
            putchar(c);
            if (c == '\n') emptyline = true;
        }
    

    【讨论】:

      【解决方案3】:

      最好使用你的那个漂亮的字符名称 [50] ;)

      存储名称直到找到“\n”,然后显示它。 这样您就可以在显示索引之前检查错误:D

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-07-11
        • 1970-01-01
        • 1970-01-01
        • 2019-01-17
        • 2017-03-12
        相关资源
        最近更新 更多