2012-01-08 9 views
5

Kiedy tworzymy plik tekstowy z tym tekstem "ali ata bak", i używamy tego pliku jako wejścia dla programu. Kod działa normalnie. Ale kiedy wpisujemy "1111111111111111111111" ten tekst w pliku tekstowym, kod nie jest oczekiwany. Więc jaki jest problem?QBitArray to QByteArray

#include <QtCore/QCoreApplication> 
#include <QBitArray> 
#include <QByteRef> 
#include <QFile> 
#include <iostream> 
#include <stdlib.h> 
#include <QTextStream> 

// Buffer Size #num of KB's 
#define BUFFER_SIZE_KB 1 

// Do not change !! 
#define BUFFER_SIZE_BYTE BUFFER_SIZE_KB*1024 
#define BUFFER_SIZE_BIT BUFFER_SIZE_BYTE*8 

using namespace std; 


QBitArray bytesToBits(QByteArray bytes) { 
    QBitArray bits(bytes.count()*8); 
    // Convert from QByteArray to QBitArray 
    for(int i=0; i<bytes.count(); ++i) 
     for(int b=0; b<8; ++b) 
      bits.setBit(i*8+b, bytes.at(i)&(1<<b)); 
    return bits; 
} 


QByteArray bitsToBytes(QBitArray bits) { 
    QByteArray bytes; 
    bytes.resize(bits.count()/8); 
    // Convert from QBitArray to QByteArray 
    for(int b=0; b<bits.count(); ++b) 
     bytes[b/8] = (bytes.at(b/8) | ((bits[b]?1:0)<<(b%8))); 
    return bytes; 
} 


int main(int argc, char *argv[]) 
{ 
    QCoreApplication a(argc, argv); 
    QString inFilename; 
    QString outFilename; 
    QTextStream qtin(stdin); 


    cout << "Filename : "; 
    qtin >> inFilename; 
    outFilename.append("_"); 
    outFilename.append(inFilename); 

    QFile infile(inFilename); 
    if (!infile.open(QIODevice::ReadOnly)) { 
     cout << "\nFile cant opened\n"; 
     system("pause"); 
     return 1; 
    } 

    QFile outfile(outFilename); 
    if (!outfile.open(QIODevice::WriteOnly)) { 
     cout << "\nFile cant opened\n"; 
     system("pause"); 
     return 2; 
    } 

    QByteArray bytes, bytes2; 
    QBitArray bits; 


    while ((bytes = infile.read(BUFFER_SIZE_BYTE)) >0) { 

     bits = bytesToBits(bytes); 
     bytes2 = bitsToBytes(bits);// PROBLEM IS HERE 
     outfile.write(bytes2); 

    } 

    outfile.close(); 
    infile.close(); 
    cout << "Finished\n"; 
    return a.exec(); 
} 
+0

Co masz na myśli przez „nieoczekiwane”? Opisz, co widzisz i czego oczekujesz. – Mat

+0

plik wyjściowy musi być taki sam z wejściem, ale plik, który ma tekst "11111" nie taki sam – sivanzor

Odpowiedz

5

Problem z inicjalizacją.

QByteArray bitsToBytes(QBitArray bits) { 
    QByteArray bytes; 
    bytes.resize(bits.count()/8+1); 
    bytes.fill(0); 
    // Convert from QBitArray to QByteArray 
    for(int b=0; b<bits.count(); ++b) 
     bytes[b/8] = (bytes.at(b/8) | ((bits[b]?1:0)<<(b%8))); 
    return bytes; 
} 

ten wytwarza właściwą odpowiedzią

+0

Również uwaga: 'while ((bytes = infile.read (BUFFER_SIZE_BYTE))> 0)' jest niepoprawny, porównując q QByteArray z int tak naprawdę nie ma sensu. – Mat

+0

Jawne zakończenie zerowe jest zbędne w QByteArray. –

+0

Również uwaga: rozmiar pliku wyjściowego rośnie o 1 bajt tym rozwiązaniem – sivanzor