我正在尝试构建一个指令管道模拟器,我开始时遇到很多麻烦.我需要做的是从stdin读取二进制文件,然后在操作数据时以某种方式将其存储在内存中.我需要一个接一个地读取正好32位的块.
我如何一次读取32位的块?其次,我如何存储它以便以后操作?
这是我到目前为止所做的,但是检查我进一步阅读的二进制块,它看起来不正确,我不认为我正在读取我需要的32位.
char buffer[4] = { 0 }; // initialize to 0
unsigned long c = 0;
int bytesize = 4; // read in 32 bits
while (fgets(buffer, bytesize, stdin)) {
memcpy(&c, buffer, bytesize); // copy the data to a more usable structure for bit manipulation later
// more stuff
buffer[0] = 0; buffer[1] = 0; buffer[2] = 0; buffer[3] = 0; // set to zero before next loop
}
fclose(stdin);
Run Code Online (Sandbox Code Playgroud)
我如何一次读取32位(它们都是1/0,没有换行等),我将它存储在char[]哪里,可以吗?
编辑:我能够读取二进制文件,但没有一个答案产生正确顺序的位 - 它们都被破坏了,我怀疑字节顺序和读取问题并且一次移动8位(1个字符) - 这个需要在Windows和C上工作......?
我试图从标准输入读取并通过其十进制值区分每个字符.根据我的理解,换行符(10)和回车符(13)将被解释为相同的字符.我想区分这两者.我知道如果我正在读取文件,我可以使用ios :: binary参数打开它.但是如果我从标准输入读取怎么办?
我创建了一个包含256个字符的文本文件,文本文件的第一个字符是ASCII值0,文本值的最后一个字符是ASCII值255.两者之间的字符均匀地从0到255递增.因此字符#27是ASCII值27.字符#148应该是ASCII值148.
我的目标是阅读此文本文件的每个字符.
我试过读这个cin.我试过cin.get()和cin.read(),这两者都应该读无格式输入.但是在阅读第26个角色时都失败了.我想当我用过时unsigned char,cin说它是读书255,这根本不是真的.当我使用普通签名时char,cin表示正在阅读-1.无论ASCII的等价字符26是什么,都应该读取.或许cin认为它受到了打击EOF?但我之前阅读过单独的StackOverflow帖子,这些帖子EOF不是一个可以写的实际角色.所以我迷失了为什么cin咳嗽表示整数-1或整数的字符值255.有人可以告诉我我做错了什么,为什么,最好的解决方案是什么,为什么?
粘贴的具体代码不多.我已经尝试了一些不同的非工作组合都涉及要么cin.get()或cin.read()与任一char或unsigned char和呼叫强制转换为char和int之间.我没有运气能够读过第26个角色,除此之外:
unsigned char character;
while ( (character = (unsigned char)cin.get()) != EOF) { ... }
Run Code Online (Sandbox Code Playgroud)
虽然有趣的是,虽然这并没有阻止我在第26个字符的while循环,但它也不会继续前进.看起来cin,它是否cin.get()还是cin.read()只是拒绝前进到下一个字符检测的东西它不喜欢的时刻.我也知道cin.ignore()存在类似的东西,但我的输入是不可预测的; 也就是说,我的文本文件的这256个字符只是一个测试用例,真正的输入是相当随机的.这是较大的家庭作业的一部分,但这个具体问题与作业无关; 我只是坚持了部分流程.
注意:我正在读取标准输入流,而不是特定的文本文件.似乎仍然没有直接的解决方案.我无法相信以前没有这样做过cin …
我试图stdin在运行时读取一个大型二进制文件思想输入重定向(),并且stdin是必需的.
./a.out < input.bin
Run Code Online (Sandbox Code Playgroud)
到目前为止,我已经使用了fgets.但是fgets会跳过空白和换行.我想包括两者.我currentBuffersize可以动态变化.
FILE * inputFileStream = stdin;
int currentPos = INIT_BUFFER_SIZE;
int currentBufferSize = 24; // opt
unsigned short int count = 0; // As Max number of packets 30,000/65,536
while (!feof(inputFileStream)) {
char buf[INIT_BUFFER_SIZE]; // size of byte
fgets(buf, sizeof(buf), inputFileStream);
cout<<buf;
cout<<endl;
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.