Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2011, 23:03   #1
Atasik
 
Регистрация: 12.12.2010
Сообщений: 5
По умолчанию Работа с файлами с использованием потоков

Помогите разобраться. Пишу программу добавления строки в произвольное место файла. Как не кручу, строка добавляться не хочет. Помогите... Где я допускаю ошибку?

#include <fstream>
#include <iostream>
#include <string.h>

using namespace std;

//Класс, объекты которого производят запись в файлы
class FileWriter
{
fstream obj;
char filename[80];
// int pos; //номер позиции
char cc;
public:

FileWriter(char *filename);
~FileWriter();
int OpenFile(); // открытие файла
void Add(int,char*); // добавление записи в файл
};

//Конструктор, принимающий в качестве параметра имя файла, в который будет производиться запись
FileWriter::FileWriter(char *_filename)
{
printf("%s \n", _filename);
strncpy(filename,_filename,80);
}

//Деструктор
FileWriter::~FileWriter()
{
obj.close();
}

int FileWriter::OpenFile()
{
obj.open(filename, ios::in|ios:ut);
if (!obj)
return -1;

else
return 0;
}

void FileWriter::Add(int i, char *cc)
{
char buf[100];
obj.seekg(0,ios::end);
int maxpos=obj.tellg();
obj.seekg(i);
obj.getline(buf,maxpos-i+1,'\0'); // считывание символов в буфер
int n=obj.gcount(); // число реально считанных символов
buf[n]='\0';
obj.seekp(i,ios_base::beg);
obj.write(reinterpret_cast<char*>(c c),sizeof(cc));
obj.flush();
obj.seekp(i+sizeof(cc),ios_base::be g);
obj.write(reinterpret_cast<char*>(& buf),sizeof(buf));
obj.flush();
cout <<"Znachenie iz bufera"<< endl;
}

int main(void)
{
int pos;
cout << "Vvod # pozitsii" << endl;
cin >> pos;

char *c;
cout << "Vvod str" << endl;
c=new char[50];
cin >> c;

FileWriter fw("file.txt");

int ii;
ii = fw.OpenFile();
cout << "ii=" << ii << endl;
if(ii==-1)
{
cout << "File not opened\n";
return -1;
}
else
{
cout << "File opened\n";
fw.Add(pos, c);
return 0;
}

}
Вложения
Тип файла: txt 54321.txt (1.8 Кб, 121 просмотров)

Последний раз редактировалось Atasik; 24.01.2011 в 23:44.
Atasik вне форума Ответить с цитированием
Старый 25.01.2011, 00:05   #2
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

вот допустим, у вас есть массив, из 10 элементов, и вдруг вам приспичило расширить его до 20 элементов, да еще и не просто в конце добавить, в посередке? что вы сделаете ? правильно, создадите массив на 20 элементов, скопируете первые 5 элементом, потом 10 новых, потом оставшихся )
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 25.01.2011, 00:16   #3
Atasik
 
Регистрация: 12.12.2010
Сообщений: 5
По умолчанию

Хорошо! А как это применить? Чего-то я не догоняю...
Atasik вне форума Ответить с цитированием
Старый 25.01.2011, 00:30   #4
kaljan775
:D
Форумчанин
 
Аватар для kaljan775
 
Регистрация: 26.09.2010
Сообщений: 570
По умолчанию

как вариант - создать тексстовй файл, записать туда все символы до желаемого, потом вставить своим символы - и потом вставить оставшиеся символы. закрыть поток исходного файла, поток выходного файла, открыть на ввод из второго текстового , на вывод в первый текстовый файл, тупо копирнуть все и удалить промежуточный файл. Знаю, извращение, можно провернуть через вектор
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery
kaljan775 вне форума Ответить с цитированием
Старый 25.01.2011, 00:36   #5
Obey-Kun
Линуксоид
Участник клуба
 
Аватар для Obey-Kun
 
Регистрация: 31.07.2009
Сообщений: 1,403
По умолчанию

Калян, в файл-то незачем писать, лучше уж в памяти работать, а потом писать.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su
Obey-Kun вне форума Ответить с цитированием
Старый 25.01.2011, 00:47   #6
Atasik
 
Регистрация: 12.12.2010
Сообщений: 5
По умолчанию

Короче, я тут накалякала... Получается фот такая функция:

void FileWriter::Add(int i, char *cc)
{
char buf[100], _buf[150];
int s=sizeof(cc);
obj.seekg(0,ios::end);
int maxpos=obj.tellg();
obj.seekg(0);
obj.getline(buf,maxpos+1,'\0');
int n=obj.gcount(); // ÷èñëî ðåàëüíî ñ÷èòàííûõ ñèìâîëîâ
buf[n+1]='\0';
cout << buf<<endl;
cout << cc<<endl;

for(int k=0;k<i;k++)
_buf[k]=buf[k];
for (k=i;k<=i+s;k++)
_buf[k]=cc[k-i];
for (k=i+s;k<=maxpos+1+s;k++)
_buf[k]=buf[k-s];
_buf[k+1]='\0';
cout << _buf;
obj.seekp(0,ios_base::beg);
obj.write(reinterpret_cast<char*>(& _buf),sizeof(_buf));
obj.flush();

}

В отладчике, все красиво получается. Но получается у меня не работает запись новой строки в файл... Помогите уж дальше... Пожалуйста!!!
Atasik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Работа с HANDLE из разных потоков sluge Win Api 6 24.01.2011 10:07
Файловый ввод с использованием потоков Blad47 Общие вопросы C/C++ 11 25.10.2010 15:19
Работа с файлом из нескольких потоков boris-blade Общие вопросы .NET 2 02.04.2010 17:21
вычисления с использованием потоков Sparky Помощь студентам 0 19.02.2010 18:09
Синхронизация потоков с использованием именованых каналов _Денис Помощь студентам 0 09.01.2010 16:58