【问题标题】:Preventing Windows program from interpreting ^Z as end of file防止 Windows 程序将 ^Z 解释为文件结尾
【发布时间】:2014-12-18 11:09:22
【问题描述】:

我的工作是从 C -> C++ 转换已安装在 linux 发行版上的应用程序。所以我希望 C 和 linux 的功能。

我在读取二进制文件时遇到问题。它表示它在到达文件的实际末尾之前遇到ctrl-Z 字符时到达EOF。

bash 中的珍贵执行

zcat file.txt.gz | txtToBinary | binaryToOutput

在命令提示符下执行

txtToBinary.exe < file.txt | binaryToOutput.exe

原始文本文件

 R  5643BYIDK           DK0016060346 11DKKXKLY 160               1
 R 10669VJK 98 1        IS0000004018  4ISKXICE 240         5000000
 M814

txtToBinary.exe - 示例输出:

^@^@^@ hello ^@    ^Z^@^@^@^@
^@^@^[SWMA ^Y^YC

问题是程序将第一个^Z 解释为文件结尾。

目前尝试过

我的解决方案是在使用 c++

在 windows 上编译时执行以下操作

在命令提示符下执行

txtToBinary.exe < file.txt | binaryToOutput.exe
int main(int argc, char* argv []){
    int loop (args_t* args){

    for (;;){
        char data [1024];
        int temp = read_msg (data, sizeof (data));
}

int read_msg(void* data, int size){
    _setmode(_fileno(stdin), _O_BINARY);
    _setmode(0,_0_BINARY);
    if(fread(((unsigned char *)data)+sizeof(*hdr),hdr->size-sizeof (*hdr),1,stdin) != 1);
        if(feof(stdin))
             printf("End of file error\n");
}

我也尝试过Cygwin,其中一些答案对我有用。但这也失败了。

StackOverflow 答案

在 SO 中查看答案时,我们看到 WindowsWindows EOFBinary solutionBinary ModeStream data end at byte 26Reaching EOF early Windows。他们告诉我:

- Windows 键 (CTRL + Z, ^Z) 结束文件

- 我必须以二进制格式阅读

【问题讨论】:

  • 您是否使用fopen(filename, "rb") 打开了文件?如果没有,请这样做。
  • '在到达文件末尾之前到达文件末尾'是一个矛盾的术语。
  • @Wintermute 程序将文件作为输入,如上所示。我想保留它。我正在尝试这样打开文件,但这会降低程序的灵活性
  • 哦,对了。 freopen(NULL, "rb", stdin) 有效吗?
  • 哼。我尝试了一些东西,Windows 的行为很奇怪。在_setmode(0, _O_BINARY); 之后,fread 可以正确处理\x1a 字符,read 也是如此。然而,getchargetcfgetc 仍然为它们提供EOF,事实证明它们甚至对使用"rb" 打开的文件流也这样做。您确定您的问题出在 fread 调用上,还是您使用其他可能遇到此类问题的读取操作?

标签: c++ c linux windows


【解决方案1】:

我找到了我的问题的答案。这与你从哪里阅读有关。你需要放

_setmode(0,_0_BINARY);

在 main() 函数中!!!!!!!!!记住这一点,否则不会包括其他读取或写入。

【讨论】:

    【解决方案2】:

    fread() 是标准输入输出的一部分。您正在做的是将原始文件作为二进制文件打开,然后执行文本模式标准 I/O。

    您可以将现有的 fread() 调用替换为 read() 系统调用。 (也就是说,fread() 是一个库调用,它做一些缓冲,最终调用到 read()。)

    【讨论】:

      猜你喜欢
      • 2014-03-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-17
      • 1970-01-01
      • 2020-07-13
      相关资源
      最近更新 更多