2016-12-24 3 views
1

J'essaye d'écrire dans un fichier et je veux utiliser Write System Call pour le rendre plus rapide. Fondamentalement, j'ai un QVector et je veux stocker les résultats dans un fichier. À l'origine, je ne faisais qu'interrompre le tableau mais c'était trop lent. J'ai donc fait des recherches et trouvé quelque chose qui s'appelle Write System Call, mais je n'arrive pas à comprendre comment configurer le code.Comment utilisez-vous l'appel système en écriture en C++?

C'est ce que je l'ai essayé jusqu'à présent:

/*Header File*/ 

QVector<unsigned short> rawData; 

/*Implementation File*/ 

int fd = open("output.txt", O_WRONLY)L 
write(fd, &rawData, rawData.size()); 
close(fd); 

Alors que le code ci-dessus ne se bloque pas sur moi, il ne fait pas écrire quoi que ce soit dans le fichier de sortie. Des idées de ce que je fais mal?

EDIT:

En utilisant fwrite Je suis capable d'écrire dans le fichier, mais les données contenues dans le fichier est un peu étrange Unicode. Fondamentalement, ce n'est pas le nombre qui est ce que j'essaie d'obtenir. Voici ce que je fais:

FILE * pFile; 

pfile = fopen("pixelValues.txt", "wb"); 

fwrite(&rawData, sizeof(unsigned short), sizeof(rawData), pFile); 

fclose(pFile); 
+0

Quelle est la déclaration de 'rawData'? – Barmar

+0

Si c'est un 'std :: vector', vous devez utiliser' & rawData [0] '. Voir http://stackoverflow.com/questions/6485496/how-to-get-stdvector-pointer-to-the-raw-data – Barmar

+0

Il n'y a aucune raison que vous deviez utiliser des appels non portables comme write() pour "faire choses plus rapides "- vous pouvez utiliser la fonction portable fwrite(). En outre, vous devez vérifier que le fichier a effectivement ouvert. –

Répondre

1

Vous supposez que vous devez écrire vos données directement à l'aide d'appels système. Sans voir votre code, je dirais que ce n'est probablement pas le cas. Très probablement, vous faisiez quelque chose de très odieusement inefficace.

Vous pouvez faire mieux: Dans Qt, le moyen le plus simple serait de tirer parti de QDataStream. Il fera tout le nécessaire pour vous redonner le même vecteur lorsque vous lirez les données plus tard. Il tout à fait correctement effectue ensuite:

bool write(const QString &filename, const QVector<uint16_t> &data) 
{ 
    QSaveFile f(filename); 
    if (!f.open(QIODevice::WriteOnly)) 
     return false; 
    QDataStream s(&f); 
    s.setVersion(QDataStream::Qt_5_6); 
    s << data; 
    return f.commit(); 
} 

QVector<uint16_t> read(const QString &filename) 
{ 
    QVector<uint16_t> data; 
    QFile f(filename); 
    if (!f.open(QIODevice::ReadOnly)) 
     return data; 
    QDataStream s(&f); 
    s.setVersion(QDataStream::Qt_5_6); 
    s >> data; 
    if (s.status() != QDataStream::Ok) 
     data.clear(); 
    return data; 
} 

Autres questions:

  1. Le fichier n'est pas un fichier texte, il ne donne pas une extension .txt.

  2. Utilisez des types avec des tailles explicites, telles que uint16_t ou quint16 au lieu de unsigned short.

3

Il y a une différence entre QVector l'objet et les éléments à l'intérieur. Vous voulez sans doute écrire les QVector éléments, donc pour faire que vous avez besoin quelque chose comme ceci:

template<typename T> 
int writeVector(const QVector<T>& vec, int fd) 
{ 
    // note: the size argument to write() is about the number of bytes 
    // which is: (size of each element) * (number of elements to write) 
    return write(fd, vec.constData(), (sizeof(T)) * vec.size()); 
} 

Pour une meilleure solution, envisager d'utiliser un QDataStream à la place:

template<typename T> 
void writeVectorBetter(QDataStream& stream, const QVector<T>& vec) 
{ 
    stream << vec; 
} 

Cela assurera également vous pouvez lire les informations à partir du fichier de manière cohérente.