CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C++] problème avec ios::out

zelda_or_link
zelda_or_link
Niveau 9
15 janvier 2012 à 03:30:36

Bonjour,

J'aurais aimé que vous m'apportiez votre lumière sur un problème que j'ai avec le paramètre ios::out.

Je travail sur mac sous snowleopard, et lorsque j'essaye d'ouvrir un fstream comme ceci :

fstream f;

f.open("monfichier.txt", ios::out);

il est censé ouvrir le fichier en mode écriture en début de fichier.

Lorsque j'exécute, il m'ouvre bien un fichier en mode écriture, mais pas le fichier existant, il efface le fichier existant et crée un nouveau fichier.

Evidemment, je peux utiliser la commande ios::app, là il conserve bien le fichier existant, malheureusement je ne peux écrire qu'en fin de fichier car j'ouvre en append.

Quelqu'un saurait si ce problème est dû à OSX, ou si vous connaissez un paramètre différent pour une ouverture en écriture en DEBUT de fichier sans suppression du fichier existant?

Merci d'avance pour vos réponses.

godrik
godrik
Niveau 30
15 janvier 2012 à 19:19:34

Si j'ai bien compris, ce que tu cherches a faire est:

tu as un fichier 'test.txt' qui fait 30 kilo-octet.
tu veux ouvrir le fichier et changer les 10 premiers kilo-octet sans changer les 20 d'apres.

Est-ce bien ca?

Je ne pense pas que la lib iostream permettent de faire ca nativement. La seule facon que je connaisses de faire ca passe utilise mmap. Si tu n'as pas besoin d'etre haute performance sur cette operations, tu dois certainement pouvoir coupler des stringstream avec un buffer dans mmap.

zelda_or_link
zelda_or_link
Niveau 9
15 janvier 2012 à 21:58:46

Oui c'est bien ça ! Merci du conseil !

Pocolo
Pocolo
Niveau 10
15 janvier 2012 à 22:03:08

" La seule facon que je connaisses de faire ca passe utilise mmap "

Et tu en fais en quoi exactement? juste par curiosité.

Les string ou stringstream ne sont pas suffisants?

Pocolo
Pocolo
Niveau 10
15 janvier 2012 à 22:03:31

en fais quoi exactement*

godrik
godrik
Niveau 30
15 janvier 2012 à 22:38:30

mmm, en effet, les iostream devrait etre suffisant... Ils utilisent open/close/write/read/lseek cote system. Et ca devrait etre suffisant pour changer les premiers octets d'un fichier. (Pour une raison etrange, je pensais que ca ne suffisait pas.)

le code C ci dessous change le premier octet du fichier foo.txt en 'a'. IOstream devrait permettre la meme chose.

  1. include <unistd.h>
  2. include <sys/types.h>
  3. include <sys/stat.h>
  4. include <fcntl.h>

int main()
{
int fd = open ("foo.txt", O_RDWR);
lseek (fd, 0, SEEK_SET);
write (fd, "a", 1);
return 0;
}

godrik
godrik
Niveau 30
15 janvier 2012 à 22:39:56

l'equivalent iostream de lseek semble etre seekp et seekg.

kufa
kufa
Niveau 9
21 janvier 2012 à 13:23:43

Faudrait que je verifie dans la doc ansi, mais fopen( "fichier.txt", "r+" ) devrait faire ce que tu veux (lecture/ecriture, ou rb+ si necessaire). Attention faut faire des fflush entre les reads et writes.

Sous forums
  • Aide à l'achat Mac
  • Création de sites web
  • Internet
  • Macintosh
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment