用cat将数据文件管道化为C ++程序

时间:2015-07-19 19:19:45

标签: c++ pipe cat

我正在寻找一些帮助从命令行管道文件(16位带符号的小端整数原始数据)到我的程序:

cat data.dat | myprogram

然后它应该将数据转换为16位有符号整数。 它适用于前12个值。第13个值是错误的,后跟零。

第二个问题是程序似乎只进入了一次while循环。

我正在使用Windows + MinGW。

我的代码:

#include <iostream>
using namespace std;

#define DEFAULT_BUF_LENGTH (16 * 16384)

int main(int argc, char* argv[]) 
{
    char buf[DEFAULT_BUF_LENGTH];

    while(cin >> buf) 
    {
        int16_t* data = (int16_t*) buf; //to int

        for(int i=0;i<18;i++)
        {
            cout << data[i] << endl;
        }
    }
    return 0;
}

输出:

0
9621
-14633
-264
5565
-12288
9527
-7109
11710
6351
4096
-5033
5773
147
0
0
0
0

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

您可能会尝试使用read()而不是>>运算符,这通常用于格式化输入。还要检查实际读取的数据量是否有用:

#include <iostream>
using namespace std;

#define DEFAULT_BUF_LENGTH (16 * 16384)

int main(int argc, char* argv[]) 
{
    char buf[DEFAULT_BUF_LENGTH];

    for(;;) 
    {
        cin.read(buf, sizeof(buf));
        int size = cin.gcount();
        if (size == 0) break;

        int16_t* data = (int16_t*) buf; //to int

        for(int i=0;i<size/sizeof(int16_t);i++)
        {
            cout << hex << data[i] << endl;
        }
    }
    return 0;
}

答案 1 :(得分:1)

语句cin >> buf 使用数据填充整个buf。它只读取下一个&#34; set&#34;非空白字符。 将cin >> buf更改为read(0, buf, sizeof(buf)) > 0

如果您坚持使用C ++流,请将循环的开头更改为:

while (!cin.eof()) {
    cin.read(buf, sizeof(buf));
    [...]