C语言中的文本编辑器使用shift键选择文本
我正在尝试用C语言设计文本编辑器。例如,我正在创建一个新的文本文件并从用户那里获取内容,直到按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 == '.') {
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是我见过的最熟练的程序员,在他自己的圈子里。