2012-01-08 6 views
5

Quando creiamo un file di testo con questo testo "ali ata bak", e utilizziamo questo file come input per il programma. Il codice funziona normalmente. Ma quando inseriamo "11111111111111111111" questo testo nel file di testo, Code non è in esecuzione previsto. Quindi qual'è il problema?QBitArray a 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

Che cosa si intende per "inaspettato"? Per favore descrivi cosa stai vedendo e cosa ti aspettavi. Il file di output – Mat

+0

deve essere uguale con l'input ma il file che ha il testo "11111" non è lo stesso – sivanzor

risposta

5

Problema di inizializzazione.

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

questo produce la risposta giusta

+0

Anche una nota: 'while ((byte = infile.read (BUFFER_SIZE_BYTE))> 0)' non è corretto, confrontando q QByteArray con un int non ha davvero senso. – Mat

+0

La terminazione null esplicita non è necessaria con QByteArray. –

+0

Anche una nota: le dimensioni del file di output crescono di 1 byte con questa soluzione – sivanzor

Problemi correlati