![]() |
|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
![]() |
|
Опции темы | Поиск в этой теме |
![]() |
#1 |
Регистрация: 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: ![]() 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; } } Последний раз редактировалось Atasik; 24.01.2011 в 23:44. |
![]() |
![]() |
![]() |
#2 |
:D
Форумчанин
Регистрация: 26.09.2010
Сообщений: 570
|
![]()
вот допустим, у вас есть массив, из 10 элементов, и вдруг вам приспичило расширить его до 20 элементов, да еще и не просто в конце добавить, в посередке? что вы сделаете ? правильно, создадите массив на 20 элементов, скопируете первые 5 элементом, потом 10 новых, потом оставшихся )
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery |
![]() |
![]() |
![]() |
#3 |
Регистрация: 12.12.2010
Сообщений: 5
|
![]()
Хорошо! А как это применить? Чего-то я не догоняю...
|
![]() |
![]() |
![]() |
#4 |
:D
Форумчанин
Регистрация: 26.09.2010
Сообщений: 570
|
![]()
как вариант - создать тексстовй файл, записать туда все символы до желаемого, потом вставить своим символы - и потом вставить оставшиеся символы. закрыть поток исходного файла, поток выходного файла, открыть на ввод из второго текстового , на вывод в первый текстовый файл, тупо копирнуть все и удалить промежуточный файл. Знаю, извращение, можно провернуть через вектор
Пишу ПО, создаю сайты, делаю курсовые работы, за деньги
C#, .NET, MS SQL, AngularJS, HTML, jQuery |
![]() |
![]() |
![]() |
#5 |
Линуксоид
Участник клуба
Регистрация: 31.07.2009
Сообщений: 1,403
|
![]()
Калян, в файл-то незачем писать, лучше уж в памяти работать, а потом писать.
Я схожу с ума или это глючит реальность?
Jabber ID: obey@obey.su |
![]() |
![]() |
![]() |
#6 |
Регистрация: 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(); } В отладчике, все красиво получается. Но получается у меня не работает запись новой строки в файл... Помогите уж дальше... Пожалуйста!!! |
![]() |
![]() |
![]() |
![]() |
||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Работа с 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 |