ch=getc(stdin);
if (ch == 114)//F4 Key. android phone is VolumeUp + r Key.
//if (ch == 27)
//实现用户手动存盘。
{
ch = '\0';//转换114为'\0'。
//putc('\n', stdin);//这里,也可以用ungetc()函数。因为ungetc()是专业的。我推荐用ungetc(),虽然putc()在类
//unix也能胜任。但类windows就说不准了。也许,国际标准组织已经想到这个问题并已解决。使得C函数可自由正确的处理不同大小端操作系统平台的任务。因为,windows是大端存储,unix是小端存储。macos也是类unix系统,所以它也是小端存储。
/* C 库函数 int ungetc(int char, FILE *stream) 把字符 char(一个无符号字符)推入到指定的流 stream 中,以便它是下一个被读取到的字符。 */
//所以,可以使用专业的字符推回流中的函数。虽然putc()可以胜任这个工作。下面,我们试试专业的函数。
ungetc('\n', stdin);
ch = getc(stdin);
if (ch == '\n')
ch = '\0';
putc(ch, stderr);//这样可以。
//putc(ch, fp);//这不需要。
fflush(fp);
}
//只有从键盘输入换行键,导致stdin刷新。才会调用输入输出函数。比如这里的getc()。
//所以,我只能祈祷你尽快按enter键了。只有按了enter键才能马上执行下面的功能。不然只能等到缓冲区(可能1024字节)满。
//而用fflush()刷新stdin,是为定义的行为。所以,我不打算那样做。
//而另外一个办法就是,把换行键放入stdin。从而,导致一连惯的连锁相应。连锁执行。这有办法做到,标准库有那样的函数。
//这也就能实现用户手动存盘的功能了。
if(ch==27)/*27 is ESC Key ascii value.*/
//ch = '\0';//实际上,这一行是多余的。不需要。因为break;直接退出了循环体。根本不给下面
//putc(ch, fp);把字符写入文件的机会。所以没有这一句,也不会把ESC写入文件。
break;
//if (ch == '\n')
// ch = 'p';
/*if (ch == 114)
ch = '\0';
if (ch == '\n')
ch = '\0';
*/
putc(ch, fp);//写入fp所指向的文件缓冲区,可能是4096字节。但此时并未把字符写入磁盘。
//这样的话,当我们写入大量符号时,一旦电脑断电,一切写入的符号都消失了。或者,程序由于未知错误导致闪退。也会一样。
//所以,应该在写入一些符号后,手动刷新文件缓冲区。使符号写入磁盘。这是一种安全措施。
//printf("putc()exe le zhi hou ,xia mian d ye zhi xing le.");
//goto skip_flush;
character_count++;
if (character_count >= 60)//防断电,防闪退。当按enter键,
//并且加上enter键前面总共敲击多于或等于60字节(包括enter键)的时候。
//把它们保存到磁盘相应的文件路径位置。
//根据这个启发,我们还可以制作让用户手动存盘的功能。
//这个功能只有输入了大于等于60个英文符号,并且之后输入了enter键。
//才会存盘。不然,断电还是一样丢失数据。这样的话,不要60字节限制了。直接按enter键之后,直接存盘,更安全。
//这就变成了enter键1个条件即可存盘。刚开始要2个条件。
//那么,这样的功能很容易实现,只要在循环体末尾加条fflush()就行了。
{
fflush(fp);
character_count = 0;
}
if (ch == 114)//F4 Key. android phone is VolumeUp + r Key.
//if (ch == 27)
//实现用户手动存盘。
{
ch = '\0';//转换114为'\0'。
//putc('\n', stdin);//这里,也可以用ungetc()函数。因为ungetc()是专业的。我推荐用ungetc(),虽然putc()在类
//unix也能胜任。但类windows就说不准了。也许,国际标准组织已经想到这个问题并已解决。使得C函数可自由正确的处理不同大小端操作系统平台的任务。因为,windows是大端存储,unix是小端存储。macos也是类unix系统,所以它也是小端存储。
/* C 库函数 int ungetc(int char, FILE *stream) 把字符 char(一个无符号字符)推入到指定的流 stream 中,以便它是下一个被读取到的字符。 */
//所以,可以使用专业的字符推回流中的函数。虽然putc()可以胜任这个工作。下面,我们试试专业的函数。
ungetc('\n', stdin);
ch = getc(stdin);
if (ch == '\n')
ch = '\0';
putc(ch, stderr);//这样可以。
//putc(ch, fp);//这不需要。
fflush(fp);
}
//只有从键盘输入换行键,导致stdin刷新。才会调用输入输出函数。比如这里的getc()。
//所以,我只能祈祷你尽快按enter键了。只有按了enter键才能马上执行下面的功能。不然只能等到缓冲区(可能1024字节)满。
//而用fflush()刷新stdin,是为定义的行为。所以,我不打算那样做。
//而另外一个办法就是,把换行键放入stdin。从而,导致一连惯的连锁相应。连锁执行。这有办法做到,标准库有那样的函数。
//这也就能实现用户手动存盘的功能了。
if(ch==27)/*27 is ESC Key ascii value.*/
//ch = '\0';//实际上,这一行是多余的。不需要。因为break;直接退出了循环体。根本不给下面
//putc(ch, fp);把字符写入文件的机会。所以没有这一句,也不会把ESC写入文件。
break;
//if (ch == '\n')
// ch = 'p';
/*if (ch == 114)
ch = '\0';
if (ch == '\n')
ch = '\0';
*/
putc(ch, fp);//写入fp所指向的文件缓冲区,可能是4096字节。但此时并未把字符写入磁盘。
//这样的话,当我们写入大量符号时,一旦电脑断电,一切写入的符号都消失了。或者,程序由于未知错误导致闪退。也会一样。
//所以,应该在写入一些符号后,手动刷新文件缓冲区。使符号写入磁盘。这是一种安全措施。
//printf("putc()exe le zhi hou ,xia mian d ye zhi xing le.");
//goto skip_flush;
character_count++;
if (character_count >= 60)//防断电,防闪退。当按enter键,
//并且加上enter键前面总共敲击多于或等于60字节(包括enter键)的时候。
//把它们保存到磁盘相应的文件路径位置。
//根据这个启发,我们还可以制作让用户手动存盘的功能。
//这个功能只有输入了大于等于60个英文符号,并且之后输入了enter键。
//才会存盘。不然,断电还是一样丢失数据。这样的话,不要60字节限制了。直接按enter键之后,直接存盘,更安全。
//这就变成了enter键1个条件即可存盘。刚开始要2个条件。
//那么,这样的功能很容易实现,只要在循环体末尾加条fflush()就行了。
{
fflush(fp);
character_count = 0;
}
