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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.04.2011, 20:41   #1
dykatob
Пользователь
 
Регистрация: 15.04.2011
Сообщений: 38
Сообщение Не понимаю работу функции fopen , как найти режим для редактирования текстового файла

Здравствуйте, уважаемые участники форума прошу, если есть время и возможность подсказать, как удалять из файла произвольную текстовую строку?
( я новичок в программировании )
в общем задание звучит так,
С Консоли ввести путь, имя файла и произвольную текстовую строку. При нахождении такой строки в файле произвести ее удаление из файла.

вот Мой набросок:
Код:
#include <stdio.h>
#include <conio.h>
int main()
{
  char putb[255];    // тут я поставил размерность строки 255 просто так) ну чтобы была размерность)
  char stroka[255];     
  
printf("BBedute puTb FaiLa, koTopbIu Hado otkPbItb");
scanf("%s",&putb);
printf("BBdedute stroky, kotoreyu Hado ydalutb iz faila");
scanf("%s",&stroka);
fp=fopen(putb,"r")
// с этой функцией fopenя долго воевал, прочитал про режимы ее работы но так и не нашел что нужно чтобы редактировать файл... только нашел как дописать в конец файла... читать файл . щас стоит r - чтение ...

прошу помочь какой режим использовать для решения моей проблемы =)

Последний раз редактировалось ACE Valery; 23.04.2011 в 02:37.
dykatob вне форума Ответить с цитированием
Старый 22.04.2011, 21:07   #2
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

ну в принципе можно считать весь файл, а потом перезаписать все кроме нужной строки
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 22.04.2011, 21:08   #3
dykatob
Пользователь
 
Регистрация: 15.04.2011
Сообщений: 38
По умолчанию

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

Гранус, а как можно перезаписать "все кроме нужной строки"
чтение я так понял производится fp=fopen(putb, "r")
а далее что прописать?

Последний раз редактировалось Stilet; 30.04.2011 в 14:01.
dykatob вне форума Ответить с цитированием
Старый 22.04.2011, 21:19   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Вот так правильно открывать файл при помощи fopen.
Код:
FILE *fp;
if((fp = fopen(putb,"rt") == NULL) return;
Сама функция кроме открытия изакрытия файла ничего не делает.
Указатели по файлу перемещаються при помощи fseek и rewind.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder

Последний раз редактировалось Smitt&Wesson; 22.04.2011 в 21:27.
Smitt&Wesson вне форума Ответить с цитированием
Старый 22.04.2011, 21:36   #5
dykatob
Пользователь
 
Регистрация: 15.04.2011
Сообщений: 38
По умолчанию

можешь объяснить пожалуйста так сказать по русски что ты написал ...
FILE *fp;
if((fp = fopen(putb,"rt") == NULL) return;

я щас посмотрел про эти функции ( fseek и rewind ) но хотелось бы найти какой-нибудь простенький пример по работе этих функций... чтобы я понял принцип работы... я щас поищу конечно, но если вам не сложно напишите примерчик)

и еще как можно удалить нужную строку, при помощи функций fseek и rewind, я ведь так понимаю что они нужны для перемещения внутри файла... т.е в нужное нам место мы перейдем и там должно произойти удаление нужной строки ( т.е переходим как например на 7-ую строку ( которая есть та что нужно удалить) и производим удаление ... как его произвести , если это возможно и если я так понял...

Последний раз редактировалось Stilet; 30.04.2011 в 14:02.
dykatob вне форума Ответить с цитированием
Старый 22.04.2011, 22:28   #6
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Код:
if((fp = fopen(putb,"rt") == NULL) return;
если fopen не открывает файл, то она возвращает NULL, что здесь и проверяется.

ну не знаю, например в массив записать построчно, запомнить номер ненужной строки и в цикле перезаписать все кроме нее, как-то атк
я всегда пользовался функциями fscanf и fprintf
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 22.04.2011, 22:38   #7
dykatob
Пользователь
 
Регистрация: 15.04.2011
Сообщений: 38
По умолчанию

я так понял, нужно взять и всю информацию из файла и занести ее в массив построчно?
затем насчет запоминания номера ненужной строки... т.е я буду сравнивать строку которую я ввел с консоли с каждой строкой в массиве, если нахожу совпадение то сохраняю в некоторую k значение номера этой строки ?
а насчет "цикле перезаписать все кроме нее" я не оч понял... поправь...
dykatob вне форума Ответить с цитированием
Старый 23.04.2011, 15:56   #8
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Про работу с файлами на СИ хорошо написано в книге Кернигана и Ритчи "Язык программирования Си". Эта книга считается классикой. Я купил её ещё год назад и никак не прочитаю полностью, либо лень, либо времени не хватает, поэтому использую как справочник.
Код:
#include <stdio.h>
#include <conio.h>
#include <string.h>

// Максимальное количество строк в файле
#define MAX_STR 1000

// Максимальное количество символов в строке
#define MAX_CHAR 255

// Найти и удалить строку из файла
void FindAndDelLine(FILE*, char* putb, char* stroka);

/////////////////////////////////////////////////////////////////////
// Демонстрация поиска и удаления введённой строки из файла
int main(int argc, char* argv[]) {
  char putb[MAX_CHAR];
  char stroka[MAX_CHAR];     
  
   printf("BBedute puTb FaiLa, koTopbIu Hado otkPbItb\n");
   scanf("%s",&putb);

   FILE* fp = fopen(putb,"r");
   if (fp) {
      printf("BBdedute stroky, kotoreyu Hado ydalutb iz faila:\n");
      scanf("%s",&stroka);
      FindAndDelLine(fp, putb, stroka);
   }
   else {
      printf("File did not found!\n");
   }
   printf("\nEnd of prog\n");
   getch();
   return 0;
}
/////////////////////////////////////////////////////////////////////


/////////////////////////////////////////////////////////////////////
// Найти и удалить строки из файла
void FindAndDelLine(FILE* ifp, char* putb, char* stroka) {
   // Символ из файла
   char charFromFile;

   // Строки, которые будут выведены в файл
   char arrOfStr[MAX_STR][MAX_CHAR];

   // Строка считанная из файла
   char strFromFile[MAX_CHAR];

   // Счётчик символов
   unsigned int countOfChar = 0;

   // Счётчик строк
   unsigned int countOfStr = 0;

   // Пока не закончится файл
   while ((charFromFile = getc(ifp)) != EOF) {
      //Пока не закончится строка
      while (charFromFile != '\n') {
         // Если конец файла, то выходим
         if (charFromFile == EOF) {
            break;
         }
         // Формируем строку
         strFromFile[countOfChar] = charFromFile;
         countOfChar++;
         charFromFile = getc(ifp);
      }
      // Закрываем строку терминатором
      strFromFile[countOfChar] = '\0';

      // Сравниваем строки
      if (strcmp(strFromFile, stroka)) {
         // Запоминаем строку для вывода
         strcpy(arrOfStr[countOfStr], strFromFile);
         countOfStr++;
      }
      // Очищаем строку
      strFromFile[0] = '\0';
      // Сбрасываем счётчик символов в строке
      countOfChar = 0;
   }
   fclose(ifp);

   FILE* iifp = fopen(putb,"w");
   countOfChar = 0;

   // Вывод строк в файл
   for(unsigned int count = 0; count < countOfStr; count++) {
      fprintf(iifp,"%s\n", arrOfStr[count]);
   }
   fclose(iifp);
}
/////////////////////////////////////////////////////////////////////
MAX_STR, MAX_CHAR нужно выбрать заведомо больше тех, которые возможны. Но на всякий случай лучше сделать проверку, не переполнились ли буферы. Не знаю как застраховаться, не привлекая С++.

Путь к файлу нужно вводить, использую двойную обратную косую черту.
8Observer8 вне форума Ответить с цитированием
Старый 29.04.2011, 18:04   #9
dykatob
Пользователь
 
Регистрация: 15.04.2011
Сообщений: 38
По умолчанию

Спасибо, огромное за такую ооочень полезную информацию!! прям обрадовали!
я так понял все эти вырезки из книги К. Р?
если да, то странно почему я в ней искал это и не нашел ((
может у меня другая какая-то...
просто с FindAndDelline я никак не разберусь как оно работает...
объясните как она работает, а то я в интернете такого не нашел(
dykatob вне форума Ответить с цитированием
Старый 29.04.2011, 18:56   #10
8Observer8
Старожил
 
Аватар для 8Observer8
 
Регистрация: 02.01.2011
Сообщений: 3,323
По умолчанию

Цитата:
Спасибо, огромное за такую ооочень полезную информацию!! прям обрадовали!
Пожалуйста, рад был помочь и поупражняться.
Цитата:
я так понял все эти вырезки из книги К. Р?
Нет этот алгоритм вы сами описали перед моим ответом.
Цитата:
просто с FindAndDelline я никак не разберусь как оно работает...
А что конкретно вам не понятно?
8Observer8 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Разработать формат текстового файла для записи команд построения примитивов... -SG- Помощь студентам 1 04.06.2010 15:44
можно ли в качестве аргумента функции использовать имя текстового файла Arassir Общие вопросы Delphi 2 31.05.2010 23:12
Создать конкорданс для текстового файла Archik Общие вопросы C/C++ 0 19.05.2010 12:12
Повторное открытие файла txt для редактирования в delphi Shaggrath Помощь студентам 8 20.07.2009 13:36
Открытие файла на чтение функция fopen bigturtle Общие вопросы C/C++ 4 28.01.2009 16:08