pipe — передача файла данных с помощью cat в программу на C ++

Мне нужна помощь в передаче файла (необработанных данных с 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

Спасибо за вашу помощь!

5

Решение

Вы можете попробовать использовать 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;
}
4

Другие решения

утверждение cin >> buf делает не заполнить весь buf с данными. Он читает только следующий «набор» непробельных символов.
+ Изменить cin >> buf в read(0, buf, sizeof(buf)) > 0

Если вы настаиваете на использовании потоков C ++, измените начало цикла на:

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