【发布时间】: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 中查看答案时,我们看到 Windows、Windows EOF、Binary solution、Binary Mode 和 Stream data end at byte 26 和 Reaching EOF early Windows。他们告诉我:
- Windows 键 (CTRL + Z, ^Z) 结束文件
- 我必须以二进制格式阅读
【问题讨论】:
-
您是否使用
fopen(filename, "rb")打开了文件?如果没有,请这样做。 -
'在到达文件末尾之前到达文件末尾'是一个矛盾的术语。
-
@Wintermute 程序将文件作为输入,如上所示。我想保留它。我正在尝试这样打开文件,但这会降低程序的灵活性
-
哦,对了。
freopen(NULL, "rb", stdin)有效吗? -
哼。我尝试了一些东西,Windows 的行为很奇怪。在
_setmode(0, _O_BINARY);之后,fread可以正确处理\x1a字符,read也是如此。然而,getchar、getc和fgetc仍然为它们提供EOF,事实证明它们甚至对使用"rb"打开的文件流也这样做。您确定您的问题出在fread调用上,还是您使用其他可能遇到此类问题的读取操作?