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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.07.2009, 15:36   #21
XAOC-forever
Пользователь
 
Регистрация: 10.04.2008
Сообщений: 47
По умолчанию

Stilet, файлы файлы и только файлы)), с радостью бы занулил эти байты, еслиб знал как...
XAOC-forever вне форума Ответить с цитированием
Старый 15.07.2009, 15:47   #22
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от XAOC-forever Посмотреть сообщение
pu4koff, всё на мутексах, так что не переживай за это
Я к тому, что, возможно, параллельная работа с файлом - может быть не самой удачной идеей, ибо выигрыш в работе с самим файлом врядли будет. Скорее наоборот.
Цитата:
Сообщение от XAOC-forever Посмотреть сообщение
на данный момент задача удалить строку в начале и засунуть её в конец, в конец засунул, а вот с удалением проблема...
Файл - есть последовательность байт, подобно массиву. Из начала или середины ничего "выкинуть" нельзя. Только заполнить чем-то другим. Таким образом, удаление первой строки может из себя представлять только перезапись всего файла в том или ином виде (можно считать сторую строку и записать её на место первой, потом третью строку дописать за второй и т.д., но это все равно приведет к перезаписи файла целиком).
Если есть возможность, то лучше посмотреть в сторону временных файлов или других каких механизмов, которые могут "спасти" от данной задачи.
pu4koff вне форума Ответить с цитированием
Старый 15.07.2009, 15:52   #23
XAOC-forever
Пользователь
 
Регистрация: 10.04.2008
Сообщений: 47
По умолчанию

pu4koff, ок, взглянем на ситуацию по иному, как нам сместить первую строку в конец файла ?)

Последний раз редактировалось XAOC-forever; 15.07.2009 в 15:55.
XAOC-forever вне форума Ответить с цитированием
Старый 15.07.2009, 16:15   #24
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
pu4koff, ок, взглянем на ситуацию по иному, как нам сместить первую строку в конец файла ?)
тебе же уже три страницы объясняют. Считываешь первую строку, затем начиная со второй строки начинаешь считывание и перезапись строк. Т.е. считали вторую, записали туда, где была первая. Считали третью - записали туда, где была вторая. и та до тех пор, пока не дойдешь до конца файла (т.е. пока не сместишь бывшую первую ситроку (которая теперь последняя) на место предпоследней).

Это элементарная задача (сам алгоритм ее решения).

А если делать"зануление" как кто-топ редложил, то ты считываешь первую строку. Определяешь ее размер в байтах и записываешь вместо этих n байт нули, а саму строку пишешь в конец. (это самый быстрый вариант, но если надо будет переносить много строк, то файл сильно разрастется.)
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс

Последний раз редактировалось ROD; 15.07.2009 в 16:17.
ROD вне форума Ответить с цитированием
Старый 15.07.2009, 16:17   #25
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от XAOC-forever Посмотреть сообщение
pu4koff, ок, взглянем на ситуацию по иному, как нам сместить первую строку в конец файла ?)
Ну читаем первую строку, пишем её в конец. Потом читаем вторую строку (можно здесь попутно её и обработать, может её тоже в конец "лить" нужно будет), перемещаемся в начало и пишем вторую строку сюда. Перемещаемся на третью строку и её обрабатываем и пишем уже после второй строки и т.д.
Код:
позиция head = 0;
пока (файл_не_кончился)
{
  прочитать_строку_из_файла;
  обработать_строку;
  если (ошибка)
  {
    дописать строку в конец;
    перейти_на_следующую_строку;
  }
  иначе
  {
    перейти_на_позицию(head);
    записать_строку_в_файл;
    head = текущая_позиция;
  }
}
Для перемещения по файлу есть функции что-то вроде fgetpos/fsetpos, если мне не изменяет память.
pu4koff вне форума Ответить с цитированием
Старый 15.07.2009, 16:17   #26
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Считываешь первую строку, затем начиная со второй строки начинаешь считывание и перезапись строк.
Все равно попахивает ошибками... В таком случае файл все равно придется открывать с запретом записи других программ...
Ато ведь параллельная работа все испортит.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.07.2009, 16:18   #27
XAOC-forever
Пользователь
 
Регистрация: 10.04.2008
Сообщений: 47
По умолчанию

ROD, давай ты сам будишь читать внимательнее ?, ясно сказано что мне не надо перебирать весь файл.

Наткнулся вот на SetFilePointer, гуглю...
XAOC-forever вне форума Ответить с цитированием
Старый 15.07.2009, 16:23   #28
ROD
Linux C++ Qt ARM
Старожил
 
Аватар для ROD
 
Регистрация: 30.11.2008
Сообщений: 3,030
По умолчанию

Цитата:
Все равно попахивает ошибками... В таком случае файл все равно придется открывать с запретом записи других программ...
Ато ведь параллельная работа все испортит.
Если файл используют несколько программ, то тут два варианта:
Вариант №1:
Открыли файл.
Считали строку.
Записали строку в конец.
Занулили считаную строку.
Закрыли файл.

Затем открыли.
Считали первую, после зануленной, строку. Записали ее вместо зануленной, оригинал занулили. Закрыли файл. и т.д.

Вариант 2:
Программа №1 контролирует файл (что-тов роде СУБД, только вместо БД у нас файлик).

Другие программы обращаются к ней, и она им раздает строки, а в свободное время от раздачи переносит строки в конец и сортирует файл. (не думаю, что это хорошая идея)



Цитата:
ROD, давай ты сам будишь читать внимательнее ?, ясно сказано что мне не надо перебирать весь файл.
Тебеже уже сказали, чито никак не "перенести", только если копировать строку в конец и "занулять" оригинал.
Дилетант широкого профиля.

"Слова ничего не стоят - покажите мне код!" © Линус Торвальдс
ROD вне форума Ответить с цитированием
Старый 15.07.2009, 16:25   #29
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
XAOC-forever
А если так:
Предположим первая строка файла выполнена ошибочно, ты получаешь об этом сигнал и выдаешь ее в отдельный файл, а "исполнитель" пропускает эту строку и начинает со следующей.
А в конце ты ему подсовываешь тот файл с ошибочными командами...

Я только одного не понимаю - проги исполнители, которые с тем файлом работают не тобой писаны? Ибо иначе их проще в единый проект слить.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 15.07.2009, 17:44   #30
profi
Участник клуба Подтвердите свой е-майл
 
Регистрация: 19.11.2007
Сообщений: 1,022
По умолчанию

Код:
#include<iostream.h>
#include<fstream.h>
#include<string.h>
#include<conio.h>

int main()
{

ifstream fi("D:\\temmpp.txt");

char*buf=new char[255];
char*mas[100];
int i=1,k=0;

cout << "Do:\n\n";

while(!fi.eof())
         {
          fi.getline(buf,255);
          mas[k]=new char[255];
          strcpy(mas[k],buf);         
          cout << mas[k] << "\n";
          k++;
         }

delete[]buf;
fi.close();

ofstream fo("D:\\temmpp.txt");

while(i<k)
{
fo << mas[i] << "\n";
delete mas[i];
i++;
}

fo << mas[0];

delete[]buf;
delete mas[0];

fo.close();

ifstream fi2("D:\\temmpp.txt");

buf=new char[255];

cout << "\n\n\nPosle:\n\n";

while(!fi2.eof())
         {
          fi2.getline(buf,255);
          cout << buf << "\n";
         }
 
fi2.close();
 
delete[]buf;

getch();
  
return 0;
}
Использовал Dev C++ 4.9.9.2.

Последний раз редактировалось profi; 15.07.2009 в 18:06. Причина: Исправил ошибки!
profi вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
memo поиск и перенос строки andrey poki Общие вопросы Delphi 4 22.03.2009 06:54
Перенос строки boostman Общие вопросы Delphi 2 08.08.2008 18:12
Путь к файлу Баламут Win Api 12 14.05.2008 13:27
Путь к файлу Terran Общие вопросы Delphi 3 13.04.2008 01:18
Путь к файлу Лубышев Общие вопросы Delphi 2 10.02.2008 21:13