Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / чтение запись файла, позиционирование микрософтовский компилятор + / 6 сообщений из 6, страница 1 из 1
15.03.2014, 00:39
    #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
15.03.2014, 00:56
    #38586988
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чтение запись файла, позиционирование микрософтовский компилятор +
tchingiz,

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


Уверен?
...
Рейтинг: 0 / 0
15.03.2014, 02:08
    #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
15.03.2014, 02:27
    #38587019
Dimitry Sibiryakov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чтение запись файла, позиционирование микрософтовский компилятор +
fflush на каждый байт это жесть.

Автор, считывай сразу блок, "шифруй" его и записывай обратно как блок. Так имеешь шансы
дожить до конца "шифрования".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
15.03.2014, 12:38
    #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
15.03.2014, 19:29
    #38587227
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чтение запись файла, позиционирование микрософтовский компилятор +
123456фффффффффффффф,

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


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