Часовой пояс: UTC + 3 часа




Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 62 из 87<  1 ... 59  60  61  62  63  64  65 ... 87  >
  Пред. тема | След. тема 
В случае проблем с отображением форума, отключите блокировщик рекламы
Автор Сообщение
 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
tolikrog писал(а):
Есть обычный текстовый файл, и в этом файле в конце стоит пустая строчка, без всяких символов, надо эту строчку пустую убрать...

Может стоять не только \n, но и \r, но чаще "\n\r".
Легче просто скопировать файл в новый, без последних ненужных символов (которых может быть несколько)...



Партнер
 

Member
Статус: Не в сети
Регистрация: 15.08.2007
tolikrog
это не пробел это \0 и будет, посмотри в hex редакторе, а то что в С он используется для обозначения конеца строки вообще к делу не относится...

можно сделать так:

открываешь файл в текстовом режиме на чтение и запись "r+"
потом идешь с конца
long pos = -1;
fseek(f, pos, SEEK_END);
читаешь символ fgetc если он равен '\r' или '\n' и не конец файла, то мотаешь дальше (--pos), как только встретился другой символ, перезаписываешь его fputc и выходишь.


 

Member
Статус: Не в сети
Регистрация: 11.01.2009
Спасибо, я сделал код по вашему алгоритму:

Код:
if ((instream=fopen(currentfilein,"r+"))==NULL)
 {
  printf("Problem with rr %s...",currentfilein);
  getch();
  exit(1);
 }

  fpos_t pos=-1;
  char chh;
  fseek(instream,pos,SEEK_END);
  chh=fgetc(instream);
  while((((chh=='\r')||(chh=='\n'))&&(!feof(instream))))
  {
   --pos;
   fseek(instream,pos,SEEK_END);
   chh=fgetc(instream);
   printf("%ld %c\n",pos, chh);
  }
   fputc(chh,instream);
  fclose(instream);
 }
}


Но в файле всё равно в конце остаётся пустая строчка.... Может я неправильно понял весь алгоритм?


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
да... обычными потоковыми функциями файл не усекается...

можно это сделать через POSIX функции.
В итоге, открываем файл для чтения в бинарном режиме (чтобы не заморачиваться с трансляцией \r\n в \n), находим позицию когда заканчиваются пустые строки и усекаем файл:

Код:
#include <fcntl.h>
#include <io.h>

...

   FILE *instream = fopen(currentfilein, "rb");

   if(!instream)
   {
      fprintf(stderr, "Problem with rr %s...", currentfilein);
      exit(1);
   }

   fseek(instream, 0, SEEK_END);
   long file_size = ftell(instream);

   if(file_size)
   {
      long pos = -1;
      fseek(instream, pos, SEEK_END);

      char chh = fgetc(instream);
      while(chh == '\r' || chh == '\n')
      {
         fseek(instream, --pos, SEEK_END);
         chh = fgetc(instream);
      }
      fclose(instream);

      int fd = _open("1.txt", _O_RDWR);
      _chsize(fd, file_size + pos + 1);
      _close(fd);
   }


 

Member
Статус: Не в сети
Регистрация: 11.01.2009
Огромное спасибо, теперь все работает как надо! Только писалось, что функция _chsize неизвестна(да и в хелпе ее нету), прописал просто chsize - заработало.


 

Member
Статус: Не в сети
Регистрация: 10.01.2010
Откуда: от Верблюда
в инсте чет начали прогу делать для расчета надежности определенной схемы....
вобщем принцип - в консольном окошке должны выводиться столбцы со значениями.....
вот никак немогу доделать( :writer: :-x
там нужно чтоб в последнем нижнем столбце начиналось обязательно с 1....и чем ниже тем меньше значение...(вероятность: 0 или 1)
я канеш думаю врядли найдутся добровольцы но если да то от меня ОГРОМНЕЙШАЯ благодарность :beer: :beer:
вот ссылка на скачку архива...в нем собсно папка с прогой...мои попытки упрощения схемы и текст с заданием и примером разбора....и текст с моим вариантом (7) отдельно)


 

Member
Статус: Не в сети
Регистрация: 17.10.2005
Задание - найти жесткие ссылки на определенный файл (Ubuntu/gcc). Как найти их количество я знаю, как найти эти самые ссылки из консоли - тоже не проблема (find), но на С пока ничего подходящего найти не могу. Не писать же вручную компаратор файлов с одинаковыми аттрибутами...

MarozOFF
честно говоря, я почти ничего не понял. Проект собрался с небольшим исправлением, P уменьшалась с 1 до 0.552. Или это был пример?


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
в stat возвращаемые поля st_ino и st_dev однозначно определяют файл, поэтому все жесткие ссылки конкретного файла будут иметь одни и те же номера inode и устройства.


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
сделай stat на файл, запомни device, inode и количество ссылок. дальше откусывай от пути по 1 директории, пока не сменится device, как только сменился - делаешь шаг назад. оттуда запускаешь рекурсивно readdir, на каждую запись делаешь stat и проверяешь для файлов inode, а для директорий - device, чтоб не уйти в другую файловую систему. на каждый найденный файл с таким же inode инкрементируй счётчик, в конце он должен совпать со значением nlinks. как вариант - можно прекращать работу как только найдёшь nlinks файлов с одинаковым inode/

думаю, получится пара сотен строк кода всего


 

Member
Статус: Не в сети
Регистрация: 17.10.2005
progn, ToSHiC
Спасибо, inode как раз то что нужно :up:


 

Member
Статус: Не в сети
Регистрация: 13.06.2007
Откуда: msk
Фото: 1
Продублирую мой пост

_________________
http://www.youtube.com/watch?v=gHcaPXe_eeg
http://vk.com/topic-13627012_27382316


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
LENIN87 писал(а):
Продублирую мой пост

UP темы не совсем понятен.
Если идёт речь в мой пост идёт о преимуществах использования CUDA - технологии - то это не С,С++ ветка...

З.Ы. пользу от CUDA можно получить если есть возможность "сильно распараллелить задачу" при редком обращении к памяти (например брутфорс хэш-паролей)


 

Junior
Статус: Не в сети
Регистрация: 03.07.2005
самая большая подборка книг когда я либо видел по С++ на русском вот здесь http://torrents.ru/forum/viewtopic.php?t=2681227


 

Member
Статус: Не в сети
Регистрация: 08.05.2006
Откуда: СПБ
такая проблема.
нужно глобально перехватить нажатие определенных клавиш.
То есть например, в данный момент работает функция ввода( cin )то при нажатии к примеру F1 он должен переключаться на другое действие.
пробовал на ассемблере это делать,но с винда 7 не дружит,или компилятор
копилятор gcc ,с оболочкой mingw

_________________
Мы все знаем, что Linux — это круто… он выполняет бесконечные циклы за 5 секунд.
* Линус Торвальдс


 

Member
Статус: Не в сети
Регистрация: 15.02.2009
Откуда: Лангепас
Russian писал(а):
такая проблема.
нужно глобально перехватить нажатие определенных клавиш.
То есть например, в данный момент работает функция ввода( cin )то при нажатии к примеру F1 он должен переключаться на другое действие.
пробовал на ассемблере это делать,но с винда 7 не дружит,или компилятор
копилятор gcc ,с оболочкой mingw


понятие "глобально" - растяжимое...[b] в какой ОС?[/b], какие клавиши... - вопросов много, а ответ (универсальный): пиши драйвер под каждую ось. С - язык великий и могучий (как русский) - перехват нажатия клавы и на нём писал, (без единой ASM вставки, ещё на TC 2.0 - если кто помнит), но только под DOS/ под Win32, Linux - только драйвер...


 

Member
Статус: Не в сети
Регистрация: 07.01.2010
http://www.codeproject.com/KB/system/nishhotkeys01.aspx


 

Member
Статус: Не в сети
Регистрация: 08.05.2006
Откуда: СПБ
ToSHiC
не совсем понятно как обрабатывать WM_HOTKEY,точнее вообще не понятно

_________________
Мы все знаем, что Linux — это круто… он выполняет бесконечные циклы за 5 секунд.
* Линус Торвальдс


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
у gcc другой синтаксис asm, но это в любом случае изврат... тем более это поди попытка использовать DOS/BIOS функции int 21 и т.п.?

чтобы перехватывать WM_HOTKEY нужно использовать winAPI: создать окно, зарегистрировать хоткей и написать обработку этого сообщения. Но я так понял программа консольная (раз речь о вводе через cin) значит это тоже плохой вариант.

лучше опиши для чего это все нужно


 

Member
Статус: Не в сети
Регистрация: 08.05.2006
Откуда: СПБ
progn
да, программа должна быть консольной
задумал сделать меню, как у волков или нортон командера

_________________
Мы все знаем, что Linux — это круто… он выполняет бесконечные циклы за 5 секунд.
* Линус Торвальдс


 

Member
Статус: Не в сети
Регистрация: 15.08.2007
можно использовать getch(), которая ждет нажатия клавиши, при этом можно обрабатывать и спец.клавиши типа F1. Если первый вызов getch() вернет 0, то это означает, что нажата спец. клавиша, чтобы получить ее код нужно вызвать повторно эту же функцию getch().


Показать сообщения за:  Поле сортировки  
Начать новую тему Новая тема / Ответить на тему Ответить  Сообщений: 1730 • Страница 62 из 87<  1 ... 59  60  61  62  63  64  65 ... 87  >
-

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Перейти:  
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB | Kolobok smiles © Aiwan