【问题标题】:I/O redirectionI/O 重定向
【发布时间】:2018-01-18 09:35:26
【问题描述】:
#include<stdio.h>
#include<stdlib.h>

int main()
{
   int i;
   for(i=1; i<=255; i++)
   {
       printf("%d %c\n",i,i);
   }
}

嘿,我正在摆脱 i/o 重定向,但我卡在了从命令提示符输出 ascii 表中,我这样做了。

C:\New folder\practice> main.exe > temp.txt

C:\New folder\practice> type temp.txt

点击回车后(输入temp.txt)它只输出前26个数字。我的问题是为什么?

也有人可以解释我如何使用重定向将代码复制到文本文件中,我知道如何使用 FILE I/O。

【问题讨论】:

  • 问题不在于您的程序,而在于type 命令在读取 Windows EOF 字符(ASCII 代码 26)后立即停止。用记事本打开你的text.txt 文件,你会发现它很好。 type 这样做可能是出于历史原因。
  • 请一次问一个问题。

标签: c windows redirect ascii


【解决方案1】:

因为您使用的是 MS-DOS... er MS WinDOS,并且 ASCII 数字 26/^Z 是文本文件的结束标记。

该功能的存在是为了使环境与 1970 年代初期的 CP/M operating system 兼容,以防您需要使用源自该文件的某些文件。正如您所注意到的,只有type 可以这样工作,但more 会显示更多...(不是双关语)。

别开玩笑了。

【讨论】:

  • 嘿,我只是用 more 代替 type,但这次并没有停在 26 :(
  • MSVC 在其 POSIX 层(即_read)实现了一种文本模式,这通常是文本文件的 Ctrl+Z 和 CRLF 处理的来源。但是 CMD 的 type 命令实际上是自己实现的。
  • 一些 Windows 命令行实用程序,例如 more.com,不使用 C 运行时库的标准 I/O。相反,他们使用一个名为 ulib.dll 的 C++ 库,它实现了自己的流类层次结构(例如STREAM => BUFFER_STREAM => FILE_STREAM),它包装了 Windows 文件 API。 FILE_STREAM 类将文件作为内存映射读取,EOF 严格由映射大小确定。 OTOH,ulib 的 KEYBOARD 流(控制台输入)确实实现了 Ctrl+Z。例如,如果您在不带参数的情况下运行 more.com,它会回显控制台输入,并且 Ctrl+Z 在一行的任意位置退出。
  • @eryksun 是时候写一个答案了:D
  • 你的答案是正确的。我只是提供一些背景信息。
【解决方案2】:

text 流中写入非 ASCII 字符是非常危险的。 0x10\n 并且可以更改为底层系统行尾,在 Windows 上为 \r\n

正确的方法是以二进制方式打开文件:

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

int main()
{
   int i;
   FILE *fd = fopen("temp.txt", "wb");
   if (NULL == fd) {
      perror("Error opening file");
      return 1;
   }
   for(i=1; i<=255; i++)
   {
       fprintf(fd, "%d %c\n",i,i);
   }
   fclose(fd);
   return 0;
}

话虽如此,期望文本文件的命令在读取 SUB 控制字符(CtrlZ 代码 0x1A)时可能会停止,即你现在的问题...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-09
    • 2010-10-22
    • 1970-01-01
    相关资源
    最近更新 更多