【问题标题】:Simple C text scanning and printing简单的C文本扫描打印
【发布时间】:2015-01-26 20:25:30
【问题描述】:

我正在编写一个非常简单的编辑器。我有它,以便程序从标准输入读取,然后立即打印到标准输出(参见下面的代码)。我想要一个接收文件的程序,然后根据命令打印或附加更多文本到文件。阅读相关问题后,我仍然很困惑如何做到这一点。我是否同时使用 scanf 来读取文件,然后 printf 打印到同一个文件中?任何澄清都非常感谢。

#include <stdio.h>

#define MAX_LINES 10

char text[MAX_LINES][MAX_LINES];


int main(void){
    FILE *infile;
    infile = fopen("file.txt", "w");

    //check for file
    if(infile==NULL){
        puts("Error--no file found");
        }


    int count, x, y;
    printf("Enter to quit the program.\n");

    for(count=1; count<MAX_LINES+1; count++){
        printf("%d: ", count);
        fgets(text[count], MAX_LINES, stdin);

    }

    for(x=0; x<count; x++){
        for(y=0;text[x][y];y++){
            putchar(text[x][y]);}
        putchar('\n');
    }
    fclose(infile);
    return 0;
 //end program
}

【问题讨论】:

  • 几乎所有编辑器都会打开一个临时文件进行写入,然后在关闭旧文件时取消链接并重命名临时文件。
  • 由于scanf() 不关心空白,但编辑文件的人关心,您不太可能使用scanf()。 (是的,您甚至可以解决这个问题,但这是一项艰苦的工作,并没有真正的回报。)您的代码显示您使用fgets(),这是一个更明智的选择。您需要将行数与行的最大宽度分开。您可能需要考虑输入的 POSIX getline(),因为它可以处理任意长的行。你打开“infile”只写,实际上是从stdin读的。
  • 有没有办法既可以从 infile 中读取,又可以将文本添加到 infile 中? (而不是标准输出?)
  • @SarahMarkers 您以写入模式打开 infile,因此您也可以对其进行写入。您可能需要使用fseek() 移动到文件中要写入的位置。您可以使用fputsfputcfprintf 等函数编写代码。

标签: c file printf scanf text-editor


【解决方案1】:

您的程序不会“从stdin 读取”,而是从命名文件读取,但不会写入该文件。

这是另一个困惑

char text[MAX_LINES][MAX_LINES];

这样会更好

#define MAX_LINES   10
#define MAX_LENGTH  1000
...
char text[MAX_LINES][MAX_LENGTH];

接下来看看这个循环

for(count=1; count<MAX_LINES+1; count++)

这将忽略数组的第 0 个元素并超出最后一个元素的范围。应该是

for(count=0; count<MAX_LINES; count++)

这是针对stdin,但如果文件是打开的磁盘文件,比如infile,您应该检查读取是否到达文件末尾

fgets(text[count], MAX_LINES, infile);

并替换为

if (fgets(text[count], MAX_LENGTH, infile) == NULL)
    break;

您的评论问题有没有办法从 infile 中读取并将文本添加到 infile? 是的,但这是不可行的,因为@JonathanLeffler 写道“首先准备一个新文件” em>。

【讨论】:

  • 好的,很酷。所以我做了这些改变,现在我还是有点困惑。现在文本编辑器不让我输入文本了。有没有办法准备 infile,然后使用 stdin 写入文件?
猜你喜欢
  • 2013-01-09
  • 1970-01-01
  • 2015-06-20
  • 2015-02-13
  • 1970-01-01
  • 1970-01-01
  • 2016-04-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多