阻止Windows程序将^ Z解释为文件末尾

时间:2014-12-18 11:09:23

标签: c++ c linux windows

我的工作是从C转换应用程序 - >已经安装在linux发行版上的C ++。我希望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 26以及Reaching EOF early Windows。他们告诉我:

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

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

2 个答案:

答案 0 :(得分:3)

我找到了问题的答案。它与您从哪里读取有关。你需要把

_setmode(0,_0_BINARY);

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

答案 1 :(得分:1)

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

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