2015-07-19 14 views
5

için kedi ile bir veri dosyası Boru programıma komut satırından (16 bit küçük endian imzalı ham verileri tamsayılar) verileri 16 bit imzalı tam sayıya dönüştürmelidir. İlk 12 değer için çalışır. 13. değer yanlış, ardından sıfırlar.Bir dosyayı akan bazı yardım arıyorum bir C++ programının

İkinci problem, programın while döngüsüne sadece bir kez girmiş gibi görünmesidir.

Windows + MinGW kullanıyorum.

Benim Kod:

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

Çıktı: Yardımlarınız için

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

teşekkürler!

+0

olası yinelenen (http://stackoverflow.com/questions/17508626/piping-for-input-output) –

+0

Kontrol [this] (http://stackoverflow.com/a/1599093/4074081) tartışma. Windows'da stdin, metin modunda açılır ve belirli bir bayt, dosyanın sonunu gösterir, çözüm, ikili modda yeniden açmaktır. – dewaffled

+0

Kullanamıyorsunuz >> >> 'satır sonlarını dönüştürür. Cin.read() 'gibi ** biçimlendirilmemiş giriş ** işlevlerini kullanmanız gerekir. http://en.cppreference.com/w/cpp/io/basic_istream – Galik

cevap

4

: Değişim cin >> buf Eğer C++ akışları kullanmakta ısrar ederse

read(0, buf, sizeof(buf)) > 0 için, sizin döngünün başlangıcını değiştirin. Ayrıca gerçekte okundu ne kadar veri kontrol yararlıdır:

#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; 
} 
[giriş/çıkış için Borulama] arasında
+0

İkinci sorun hala var, program sadece ilk 12 değeri yazdırıyor. Programlarımı 'g ++ myprogram.cpp -static -o myprogram 'ile derlediğimi söylemeyi unuttum. Belki de sebebi bu mu? Programımı -static bayrağı olmadan derlersem, yürütme sonrasında çöker (APPCRASH: Hata Modülü Adı: libstdC++ - 6.dll). Bu sorun için çözüm bulunamadı, ancak bunun 64bit Windows ile bir ilgisi olduğunu düşünüyorum. Linux üzerinde kodunuz beklendiği gibi çalışır. – fuxT

+0

Giriş dosyanızın –

+0

olması faydalı olurdu '-static 'işaretini ayarlamazsam bile basit bir helloworld.cpp programı çöküyor. Sanırım MinGW'm bozuldu. Benim Sorunum buna benzer: [http://stackoverflow.com/questions/18157464/c-helloworld-program-compiled-with-mingw-crashes-with-illegal-argument] fakat libstdC++ yoktur. Dll ' 'windows \ syswow64' içinde silebilirim ... – fuxT

1

Tablosu cin >> bufdeğil verilerle bütün buf doldurmak yapar. Beyaz olmayan karakterlerin yalnızca "kümesini" okur. Bunun yerine biçimlendirilmiş girişi için genellikle >> operatörü arasında read() kullanmayı deneyebilir

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

Tanıya katılıyorum; sorun budur. Önerilen çözümün en iyi seçenek olduğuna ikna olmadım. Elbette, '' başlığını da gerektiren read() 'gibi POSIX dosya tanıtıcı işlevlerine geri dönmek yerine 'cin'den ikili veri okuma yolları vardır. –

+0

@JonathanLeffler: Bazen, 'iyi C'nin kullanılması daha basittir;) – nsilent22

İlgili konular