2015-07-19 12 views
5

C++ Sto cercando un aiuto tubazioni un file (a 16 bit firmato little endian numeri interi dati grezzi) dalla riga di comando per il mio programma:Tubazioni un file di dati con il gatto a un programma

cat data.dat | myprogram 

Poi dovrebbe convertire i dati in interi con segno a 16 bit. Funziona per i primi 12 valori. Il 13 ° valore è sbagliato, seguito da zero.

Il secondo problema è che il programma sembra entrare nel ciclo while solo una volta.

Sto usando Windows + MinGW.

My Code:

#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; 
} 

uscita:

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

Grazie per il vostro aiuto!

+0

possibile duplicato di [tubazioni per l'ingresso/uscita] (http://stackoverflow.com/questions/17508626/piping-for-input-output) –

+0

Controllare [this] (http://stackoverflow.com/a/1599093/4074081) discussione. Su Windows, lo stdin viene aperto in modalità testo e un determinato byte indica la fine del file, la soluzione è riaprirlo in modalità binaria. – dewaffled

+0

Non è possibile usare '>>' converte le terminazioni di riga. Devi usare ** input non formattato ** funzioni come 'cin.read()'. http://en.cppreference.com/w/cpp/io/basic_istream – Galik

risposta

4

Si potrebbe provare ad usare read() al posto del >> dell'operatore, che è generalmente per l'input formattato. Anche controllando la quantità di dati è stato effettivamente letto è utile:

#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; 
} 
+0

Il secondo problema è ancora lì, il programma stampa solo i primi 12 valori. Ho dimenticato di menzionare che compilo i miei programmi con 'g ++ myprogram.cpp -static -o myprogram'. Forse questa è la ragione? Se compilo il mio programma senza il flag -statico si blocca dopo l'esecuzione (APPCRASH: Error Module Name: libstdC++ - 6.dll). Non ho trovato alcuna soluzione per questo problema, ma penso che abbia qualcosa a che fare con Windows a 64 bit. Su Linux il tuo codice funziona come previsto. – fuxT

+0

Sarebbe utile avere il file di input –

+0

Anche un semplice programma helloworld.cpp si blocca se non si imposta il flag '-static'. Penso che il mio MinGW sia rotto. Il mio problema è simile a quello: [http://stackoverflow.com/questions/18157464/c-helloworld-program-compiled-with-mingw-crashes-with-illegal-argument] ma non c'è 'libstdC++. Dll' in 'windows \ syswow64' che potrei cancellare ... – fuxT

1

Dichiarazione cin >> buf fa non riempire l'intero buf con i dati. Legge solo il prossimo "set" di caratteri non bianchi. Change cin >> buf-read(0, buf, sizeof(buf)) > 0

Se ti ostini a usare i flussi C++, cambiare all'inizio del vostro ciclo per:

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

Sono d'accordo con la diagnosi; quello è il problema. Non sono convinto che il rimedio suggerito sia l'opzione migliore. Ci sono, sicuramente, modi per leggere i dati binari da 'cin' piuttosto che ricorrere alle funzioni dei descrittori di file POSIX come' read() ', che richiederebbe anche l'intestazione' '. –

+0

@JonathanLeffler: beh, a volte è più semplice usare il vecchio C buono;) – nsilent22

Problemi correlati