C语言中的文本编辑器使用shift键选择文本

C语言中的文本编辑器使用shift键选择文本,c,C,我正在尝试用C语言设计文本编辑器。例如,我正在创建一个新的文本文件并从用户那里获取内容,直到按 void Create() { fp1 = fopen("temp.txt", "w"); printf("\n\tEnter the text and press '.' to save\n\n"); while (1) { c = getchar(); fputc(c, fp1); if (c == '.') {

我正在尝试用C语言设计文本编辑器。例如,我正在创建一个新的文本文件并从用户那里获取内容,直到按

void Create() {
    fp1 = fopen("temp.txt", "w");
    printf("\n\tEnter the text and press '.' to save\n\n");
    while (1) {
        c = getchar();
        fputc(c, fp1);
        if (c == '.') {
            fclose(fp1);
            printf("\n\tEnter then new filename: ");
            scanf("%s", fn);
            fp1 = fopen("temp.txt", "r");
            fp2 = fopen(fn, "w");
            while (!feof(fp1)) {
                c = getc(fp1);
                putc(c, fp2);
            }
            fclose(fp2);
            break;
        }
    }
}
在这里之前一切都很好,我的问题是我希望用户可以使用shift键选择文本,并使用上/下箭头在文本中导航…

标准C99或(阅读规范草案)不知道键盘或按钮。您可能需要一些与操作系统相关的库

假设您的操作系统是POSIX(例如Linux),您想了解更多关于和TTY的信息(请阅读本页);然后您应该使用类似的库(但不要对终端I/O使用任何
函数)

或者你想要一些,那么最好使用一些或(例如,等等…)


你需要数月(或数年)的工作来制作一个文本编辑器。因此,请研究现有编辑器的源代码以获得灵感。

这里的一切都不好。您的程序存在多个问题:

  • 您没有定义
    c
    fp1
    fp2
    fn
  • 您以不安全的方式使用scanf()
  • stdin
    读取时,您不会检查
    EOF
  • 存储到
    temp.txt
  • 也检查
  • 使用单个字符
    作为最终标记有副作用:您将无法在文件中使用该字符,这是一个很大的限制。至少应该在开始时考虑<代码> .<代码>。< /LI>
以下是一个改进的版本:

int Create(void) {
    FILE *fp1, *fp2;
    char fn[1024];
    int last = '\n', c;

    fp1 = fopen("temp.txt", "w+");
    if (fp1 == NULL) {
        printf("Cannot create file temp.txt\n");
        return -1;
    }
    printf("\n\tEnter the text and press '.' to save\n\n");
    while ((c = getchar()) != EOF && (c != '.' || last != '\n')) {
        fputc(c, fp1);
        last = c;
    }
    for (;;) {
        printf("\n\tEnter then new filename: ");
        if (scanf(" %1023[^\n]%*c", fn) != 1) {
            printf("input error\n");
            fclose(fp1);
            return -2;
        }
        fp2 = fopen(fn, "w");
        if (fp2 == NULL) {
            printf("Cannot create output file %s\n", fn);
        } else {
            break;
        }
    }
    rewind(fp1);
    while ((c = getc(fp1)) {
        putc(c, fp2);
    }
    fclose(fp2);
    fclose(fp1);
    return 0;
}
如果希望编写交互式编辑器,则需要使用
stty()
将终端设置为原始模式,并使用库(如
ncurses
)处理全屏输出和光标键输入。您还可以假设终端支持ANSI转义序列以及相应的硬代码输入和输出


这样的项目是一项相当艰巨的工作。我强烈建议您查看现有的开源编辑器,阅读源代码并了解它们如何处理各种任务。我个人合著了一个名为
qemacs
(用于QuickEmacs)的Emacs克隆。您可以阅读相关内容并从中获取源代码,但对于初学者来说,这是一个需要解决的大型项目。

您需要一个库来解决这个问题,比如诅咒或ncurses。Qemacs由F.Bellard编写。你就是那个家伙吗?@BasileStarynkevitch:不,我不是Fabrice,我和Fabrice合著了qemacs,我和他共事了18年。Fabrice在很多年前就停止了QEMAC的工作,我是唯一的维护者。你认识FB吗?不是个人,而是名声。@BasileStarynkevitch:Fabrice是我见过的最熟练的程序员,在他自己的圈子里。