Жазба мәнін қолданбайтын функция жазу

Мен жазба жазу үшін C ++ файлын белгілі бір жерде қолдануға тырысамын

сондықтан мен негізінен бар

ofstream ofs("file.dat", ios::binary | ios::app);
ofs.seekp(220, ios::beg);
ofs.write((char *)&i, sizeof(i));

Бірақ не істесем де, ол әрқашан файлдың соңында жазады.

Бұл iso :: app байланысты. Мысалы, құжаттамаға сәйкес

app (append) Set the stream's position indicator to the end of the stream before each output operation

Бірақ егер ate немесе ештеңе қолданбасам, ол әрқашан файлдың мазмұнын өшіреді.

Кез келген көмек керемет болар еді :)

4

3 жауаптар

Иә, бұл мінез-құлыққа әкелетін iOS :: app . Оны iOS :: in | түрінде ауыстырыңыз iOS :: out .

edit: It wasn't clear from your question, but your comments suggest that you're trying to insert data in the middle of the file, rather than overwrite a portion of the file. If that is indeed the case, you pretty much have to use a second file for that.

5
қосылды
@ Пате: Әдепкі түрде, сіз оны пайдаланбай жатсаңыз (сіз iOS :: екілік ... ) пайдаланасыз. Сонымен қатар, сіз «үзілістер» деп айтқан кезде, дәл қалай?
қосылды автор NPE, көзі
Әдепкі бойынша, iOS :: out. Бағдарламаны үзіліспен iOS :: қосу.
қосылды автор Paté, көзі
Қателерді тексердіңіз бе (eofbit, failbit, badbit)?
қосылды автор Dana Holt, көзі
@ Пате: Ия, деректерді іздей алмайсыз. Ол бар деректерді қайта бастай бастайды. Сіз бірінші бөлікті (кірістіргіңіз келген жерге дейін) шығару керек, жаңа деректерді енгізіп, қалғандарын қосыңыз.
қосылды автор Dana Holt, көзі

Файлды қосу режимі

Егер OS (және желілік файл жүйесі, егер қолданылса) қосылым режиміне қолдау көрсетсе, қосымшаны орнату режимі көптеген жазбалар болған кезде файлдағы деректер жазылған деректерді қайта жазудан бас тартпайды деп кепілдік береді. Бұл әртүрлі үрдістерден іздеу мен жазудың арасындағы жарыстың себебінен аптаның режимінсіз істей алмайтын нәрсе. Журнал файлдары үшін маңызды кепілдік.

Append режимінде файлдың соңында тек анықтамамен жаза аласыз.

Iostream режимдерін ашу

According to [ofstream.cons], ofstream (s, mode) calls rdbuf()->open(s, mode|ios_base::out).

[Filebuf.members] ішіндегі «Файлды ашу режимдері» кестесіне сәйкес filebuf :: open әрекеті fopen ашық режимдерінде анықталады:

  • out means "w"
  • app and app|out mean "a"
  • in|out means "r+"
  • in|out|trunc means "w+"

fopen man сәйкес, режимдер мыналарды білдіреді:

  • r+ Open for reading and writing.
  • w Truncate file to zero length or create text file for writing.
  • w+ Open for reading and writing. The file is created if it does not exist, otherwise it is truncated.
  • a Open for appending (writing at end of file). The file is created if it does not exist.

Соңында, ate дегеніміз fseek (файл, 0, SEEK_END) дегенді білдіреді.

Осылайша, егер сіз жазбаны жазбаша түрде еркін күйде ашуды қаласаңыз, бар деректерді жоймай, сізге fopen (s, «r +») немесе ofstream (s, iOS :: in | iOS :: out) .

IOW, C/C ++ -де Сізге файлды қайта жазуды оны қайта жазбастан ашу үшін ашу керек!

POSIX әлемі

Оның орнына POSIX ашық туларына тікелей кіру үшін POSIX open функциясын қолданғыңыз келуі мүмкін: O_READ , O_WRITE , O_CREAT O_EXCL , O_TRUNC ... filebuf :: open </< код> жалаушалар.

Әрине, бұл функция C ++ стандартты бөлігі емес. Мен барлық тиісті жүйені open қолдауына сенемін.

1
қосылды

iOS :: app орнына iOS :: out қолданып көрдіңіз бе?

EDIT:

@Curiousguy деп аталатын құжаттарды оқығаннан кейін сізге iOS :: in | керек болады iOS :: out орнына iOS :: out дегенді білдіреді.

1
қосылды
Бар файлды қысқартқыңыз келе ме?
қосылды автор curiousguy, көзі
@curiousguy: Жоқ, құжаттарымды оқығаннан кейін менің жауапымды жаңарттым.
қосылды автор Dana Holt, көзі