使用 cat 将数据文件通过管道传输到 C++ 程序
Piping a data file with cat to a C++ program
我正在寻找从命令行向我的程序传输文件(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
感谢您的帮助!
语句cin >> buf
不会用数据填充整个buf
。它只读取下一个 "set" 个非空白字符。
将 cin >> buf
更改为 read(0, buf, sizeof(buf)) > 0
如果您坚持使用 C++ 流,请将循环的开头更改为:
while (!cin.eof()) {
cin.read(buf, sizeof(buf));
[...]
您可以尝试使用 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;
}
我正在寻找从命令行向我的程序传输文件(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
感谢您的帮助!
语句cin >> buf
不会用数据填充整个buf
。它只读取下一个 "set" 个非空白字符。
将 cin >> buf
更改为 read(0, buf, sizeof(buf)) > 0
如果您坚持使用 C++ 流,请将循环的开头更改为:
while (!cin.eof()) {
cin.read(buf, sizeof(buf));
[...]
您可以尝试使用 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;
}