2010-05-09 8 views
4

Déplacé la question ici. Supposons que je veux stocker 1 000 000 000 entiers et que je ne puisse pas utiliser ma mémoire. Je voudrais utiliser un fichier (qui peut facilement gérer autant de données). Comment puis-je le laisser lire et écrire et en même temps. En utilisant fstream file("file.txt', ios::out | ios::in); ne crée pas un fichier, en premier lieu. Mais en supposant que le fichier existe, je ne peux pas utiliser pour lire et écrire simultanément. Quel est ce que je veux dire: Que le contenu du fichier soit 111111 Ensuite, si je lance: -Lire et écrire simultanément des fichiers?

#include <fstream> 
#include <iostream> 
using namespace std; 
int main() 
{ 
    fstream file("file.txt",ios:in|ios::out); 
    char x; 
    while(file>>x) 
    { 
    file<<'0'; 
    } 
return 0; 
} 

pas Si le contenu du fichier maintenant 101010? Lire un caractère, puis écraser le suivant avec 0? Ou alors, tout le contenu a été lu immédiatement dans un tampon, s'il n'y avait pas au moins un 0 dans le fichier? 1111110? Mais le contenu reste inchangé. S'il vous plaît, expliquez. Merci.

+0

Question intéressante. Quand je mets 'file.tellg(); file.tellp(); 'avant et après' file << '0'; ', j'obtiens en effet' 101010' (découvert accidentellement avec la sortie de débogage). Cela suggère un comportement indéfini dans le programme? Bug dans la mise en œuvre de fstream? – UncleBens

Répondre

1

Deux solutions possibles qui seraient beaucoup plus efficaces: (i) utiliser un système d'exploitation 64 bits ou (ii) utiliser mmap.

% man mmap

4

Les filestreams maintiennent deux pointeurs, l'un de la lecture et un pour l'écriture. Si vous effectuez des opérations de lecture/écriture, vous devez définir ces pointeurs explicitement avec les fonctions membres seeg et seekp. Vous constaterez également que faire des E/S formatées peut interférer avec ce que vous essayez de faire, donc vous devriez utiliser les fonctions membres get/put et read/write à la place. Voir également Why can't I read and append with std::fstream on Mac OS X? pour plus d'informations sur les modes ouverts avec fstreams.

Questions connexes