powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / чтение запись файла, позиционирование микрософтовский компилятор +
6 сообщений из 6, страница 1 из 1
чтение запись файла, позиционирование микрософтовский компилятор +
    #38586983
Фотография tchingiz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
#include <string.h>
#include <stdio.h>
#include <stdlib.h>

//http://msdn.microsoft.com/en-us/library/vstudio/db4fefz1.aspx

void main(int argc, char * argv[])
{
  int     dflag =1;
  char    x     = 2;
  size_t  bytes = 0;
  fpos_t  pos;
  fpos_t  eoff;
  long foo;
  char    buff;
  char    next;
  int xx [100];
  int     d =0;
  if (argc > 1) {
     x = atoi(argv[1]);
  }
	//открытие файла на запись
	FILE*fio=fopen("Test.txt","r+b");
	if(fio) {

     if (fseek(fio,0,SEEK_END)!=0){
       fprintf(stderr, "can't seek to end position");
   	   perror("end seek");
       goto error;
     }
     fgetpos(fio, &eoff);
     foo = eoff;
     fprintf(stderr, " length of file: %ld", foo);

     if (fseek(fio,0,SEEK_SET)!=0){
       fprintf(stderr, "can't seek to start position");
   	   perror("start seek");
       goto error;
     }
     fgetpos(fio, &pos);

     for (pos = 0; pos < eoff; pos++){
       fsetpos(fio, &pos);    //<---------------???
       fread(&buff, 1, 1, fio);
       next =  buff^x;
       fsetpos(fio, &pos);
       foo = pos;
       fprintf(stderr, "\n  position/new/old symbol: %d / '%c'/'%c'", foo, next, buff);
       fwrite(&next, 1, 1, fio);
     }
    foo = pos;
		fprintf(stderr, "\n end of file %d", foo );
    error:fclose(fio);
	}
	else {
	   perror("Test1.txt");
	}

	//показ результата на экран
}



шифрую файл test.txt.
не могу понять зачем требуется позиционирование fsetpos(fio, &pos); //<---------------???
в начале цикла? Без этой строчки файл портится.
fwrite в конце цикла выводит байт, головка сдвинулась на следующий, он и должен
читаться. Но без лишнего fsetpos не получается

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
     for (pos = 0; pos < eoff; pos++){
       fsetpos(fio, &pos);    //<---------------???
       fread(&buff, 1, 1, fio);
       next =  buff^x;
       fsetpos(fio, &pos);
       foo = pos;
       fprintf(stderr, "\n  position/new/old symbol: %d / '%c'/'%c'", foo, next, buff);
       fwrite(&next, 1, 1, fio);
     }
...
Рейтинг: 0 / 0
чтение запись файла, позиционирование микрософтовский компилятор +
    #38586988
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz,

//открытие файла на запись
FILE*fio=fopen("Test.txt","r+b");


Уверен?
...
Рейтинг: 0 / 0
чтение запись файла, позиционирование микрософтовский компилятор +
    #38587016
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
tchingiz,

докаWhen the "r+", "w+", or "a+" type is specified, both reading and writing are allowed (the file is said to be open for "update"). However, when you switch between reading and writing, there must be an intervening fflush, fsetpos, fseek, or rewind operation. The current position can be specified for the fsetpos or fseek operation.

Т.е. ответ на ваш вопрос такой: fsetpos нужен, потому что когда поток открыт и для записи и для чтения, между чтением и записью (и наоборот) нужно вызывать либо fflush либо fseek либо fsetpos (последние неявно делают fflush).
А иначе потоку непонятно, что у него в буфере, незаписанные на физ носитель данные или несчитанные приложением из потока.
...
Рейтинг: 0 / 0
чтение запись файла, позиционирование микрософтовский компилятор +
    #38587019
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fflush на каждый байт это жесть.

Автор, считывай сразу блок, "шифруй" его и записывай обратно как блок. Так имеешь шансы
дожить до конца "шифрования".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
чтение запись файла, позиционирование микрософтовский компилятор +
    #38587115
MasterZivtchingiz,

//открытие файла на запись
FILE*fio=fopen("Test.txt","r+b");


Уверен?

эээээ, намекаешь на порядок? rb+?
заглянул в мсдн уже не уверен.
http://msdn.microsoft.com/en-us/library/yeby3zcb.aspx
там такой таблицы, как была раньше уже нет



http://www.chitay.org/c/13/fopen.htm "rb+" или "r+b" Открывает двоичный файл для чтения и записи
...
Рейтинг: 0 / 0
чтение запись файла, позиционирование микрософтовский компилятор +
    #38587227
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
123456фффффффффффффф,

По fopen забудьте, все правильно.
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / чтение запись файла, позиционирование микрософтовский компилятор +
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]