防止Windows程序将^ Z解释为文件结尾

我的工作是翻译一个已经安装在linux发行版上的C – > C ++应用程序,所以我希望C和linux的function完全相同。

我有一个阅读二进制文件的问题。 它表示在到达文件的实际末尾之前,遇到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解释为文件的结尾。

尝试到目前为止

我的解决scheme一直在使用c ++编译窗口时执行以下操作

在命令提示符下执行

 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答案

当在这里查看答案时,我们看到Windows , Windows EOF , 二进制解决scheme , 二进制模式和stream数据在字节26处结束,在 Windows早期达到EOF 。 他们告诉我:

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

– 我必须以二进制格式读取

Solutions Collecting From Web of "防止Windows程序将^ Z解释为文件结尾"

我找到了我的问题的答案。 这与你读的地方有关。 你需要放

_setmode(0,_0_BINARY);

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

fread()是stdio的一部分。 你正在做的是打开原始文件为二进制文件,然后做文本模式的标准I / O。

您可以使用read()系统调用来替换现有的fread()调用。 (也就是说,fread()是一个库调用,它执行一些缓冲,最后调用read()。)