我的工作是从C转换应用程序 - >已经安装在linux发行版上的C ++。我希望C和linux的功能完整。
我在阅读二进制文件时遇到问题。它表示当它到达文件的实际末尾之前遇到ctrl-Z
字符时它到达EOF。
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
^@^@^@ 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,其中一些答案有我。但那也失败了。
在SO中查看答案时,我们会看到Windows,Windows EOF,Binary solution,Binary Mode和Stream data end at byte 26以及Reaching EOF early Windows。他们告诉我:
- Windows键(CTRL + Z,^ Z)结束文件
- 我必须以二进制格式阅读
答案 0 :(得分:3)
我找到了问题的答案。它与您从哪里读取有关。你需要把
_setmode(0,_0_BINARY);
在main()函数中!!!!!!!!请记住这一点,否则将不包括其他读取或写入。
答案 1 :(得分:1)
fread()是stdio的一部分。您正在做的是将原始文件打开为二进制文件,然后执行文本模式标准I / O.
您可以使用read()系统调用替换现有的fread()调用。 (也就是说,fread()是一个库调用,它执行一些缓冲,最终调用read()。)