Форум программистов, компьютерный форум CyberForum.ru

Работа с файлами, вставка в середину документа и навигация в нем с fseek - C++

Восстановить пароль Регистрация
 
gus21rus
0 / 0 / 0
Регистрация: 31.03.2013
Сообщений: 7
22.06.2014, 15:15     Работа с файлами, вставка в середину документа и навигация в нем с fseek #1
Товарищи, доброго вам дня. Столкнулся вот с такой проблемой. fseek не переносит указатель в нужную часть документа.
C
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
int set_pos(struct DATABASE &db,int file,unsigned int pos)
{
int ERR=0;
switch(file)
  {
  case 0:
  ERR=fseek(db.index,pos,SEEK_SET);
  if(ERR<0) {return -1;} // Ошибка
  db.pos_index=pos;
  return db.pos_index;
  case 1:
  ERR=fseek(db.data,pos,SEEK_SET);
  if(ERR<0) {return -1;} // Ошибка
  db.pos_data=pos;
  }
return 0;
}
//*************************************************************************************************
int db_read(struct DATABASE &db,int file,str &read_buff,unsigned int pos,unsigned int len)
{
int ERR=0;
char *temp_buff=new char[len];
if(set_pos(db,file,pos)<0) {return -1;}
if(read_buff.free_size<len)
  { add_size(read_buff,len); }
ERR=fread(&temp_buff[0],1,len,(file==0) ? db.index : db.data);
if(ERR<0) {delete[] temp_buff; return -1;}
switch(file)
  {
  case 0:
  db.pos_index+=len;
  break;
  case 1:
  db.pos_data+=len;
  }
StrCpy(read_buff,&temp_buff[0],len);
delete[] temp_buff;
return ERR;
}
//-------------------------------------------------------------------------------------------------
int db_write(struct DATABASE &db,int file,str &write_buff,unsigned int pos)
{
int ERR=0;
if(set_pos(db,file,pos)<0) {return -1;}
ERR=fwrite(&write_buff.buff[0],1,write_buff.data_size,(file==0) ? db.index : db.data);
if(ERR<0) {return -1;}
switch(file)
  {
  case 0:
  db.pos_index+=write_buff.data_size;
  break;
  case 1:
  db.pos_data+=write_buff.data_size;
  }
return ERR;
}
Суть проблемы вот в чем. В тестовом варианте программы Я сначала пишу в файл определенную строку а потом стараюсь прочитать ее. Пишу я ее с нулевым смещением относительно начала файла (SEEK_SET).
Сам лисинг тестовой программы.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include "str.h"
#include "database.h"
using namespace std;
DATABASE db;
str buffer;
str out_buffer;
int main()
{
open_database(db);
init_str(buffer);
init_str(out_buffer);
cout<<"Current position of index="<<get_current_pos(db,0)<<". Current position of data="<<get_current_pos(db,1);
StrCpy(buffer," Yeah?");
set_end(buffer);
cout<<"Writing to bd="<< buffer.buff<<endl;
db_write(db,0,buffer,0);
db_read(db,0,out_buffer,0,10);
set_end(out_buffer);
cout<<"Out buffer= "<<out_buffer.buff<<endl;
}
StrCpy(buffer," Yeah?"); - Здесь я переодически меняю значение литерала, он пишет ее в конец, хотя по задумке должен в начало. А читает в out_buff верно с нулевой позиции. В чем может быть дело?

Добавлено через 3 часа 19 минут
Никто не может помочь?

Добавлено через 1 час 0 минут
Решил проблему заменой "ab+" на "rb+"
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
22.06.2014, 15:15     Работа с файлами, вставка в середину документа и навигация в нем с fseek
Посмотрите здесь:

работа с fseek и файлами C++
вставка содержимого файла в середину другого C++
Функция fseek C++
C++ Работа с файлами (fseek)
Работа с файлами (Скопировать слова из одного текстового файла в другой, расположив их в нем в порядке возрастания длины) C++
fseek не работает C++
Асемблерная вставка множение \ деление в нем C++
Вставка элемента в середину массива C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 15:13. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru