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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 27.08.2009, 16:03   #1
_Dis_
 
Аватар для _Dis_
 
Регистрация: 27.08.2009
Сообщений: 8
По умолчанию С++. Ошибка при удалении последней строки из файла

Здравствуйте! Помогите пожалуйста.
Есть функция, которая удаляет из файла строку, выбранную пользователем. Работает идеально со всеми строками, кроме последней. При выборе для удаления последней строки, программа вылетает с ошибкой, а в отредактированном файле появляется переход на новую строку в самом конце.
Код:
void edit_student(int number)
{
 if((f = fopen("studfile.txt","r+"))==NULL)//открытие исходного файла
 {printf("\nCan't open file...\n");
   return;
 }
   int i=0;//счётчик считанных строк
   if((f1 = fopen("studfile1.txt","w"))==NULL)//открытие временного файла
 {
   printf("\nCan't open file...\n");
   return;
  }
   while(feof(f))
//пока не конец файла читаем строку из studfile.
   {
       char line[100], *result;
       result = fgets(line, 100, f);
       i++;  //увеличиваем счётчик считанных строк     
       if(i==number){continue;}//если номер считанной строки совпа с номером строки, выбранной пользователем для удаления, то пропускаем шаг 
       fputs(result, f1);//если не совпал, то пишем её в studfile1
    }
  
  ifclose(f);
  fclose(f1);
//закрыли оба файла
  remove("studfile.txt");//удалили исходный
//переименовывание временного файла в исходный
  char *oldname, *newname;
  oldname = "studfile1.txt";
  newname = "studfile.txt";
  rename(oldname, newname);
  return;
}
system("PAUSE"); /*GOT MILK?*/
_Dis_ вне форума Ответить с цитированием
Старый 27.08.2009, 16:16   #2
XeN0N
Форумчанин
 
Аватар для XeN0N
 
Регистрация: 18.01.2009
Сообщений: 118
По умолчанию

while(!feof(f)) наверно?

читать, пока НЕ кончится
XeN0N вне форума Ответить с цитированием
Старый 27.08.2009, 17:06   #3
_Dis_
 
Аватар для _Dis_
 
Регистрация: 27.08.2009
Сообщений: 8
По умолчанию

Простите, при написании поста удалила "!".
Как вылетало, так и вылетает, продолжая добавлять переход на следующую строку.
system("PAUSE"); /*GOT MILK?*/
_Dis_ вне форума Ответить с цитированием
Старый 27.08.2009, 17:12   #4
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А где текст ошибки?

p.s. Ябы делал не так. Я бы посимвольно считывал и тут же записывал в новый файл до i-того перевода каретки, потом пропускал запись. пока не перевод каретки или конец файла.
Ато ты выделили 100 символов на строку, но не факт что их меньше будет.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 27.08.2009, 18:17   #5
_Dis_
 
Аватар для _Dis_
 
Регистрация: 27.08.2009
Сообщений: 8
По умолчанию

После вылета программы открываю файл, там как и нужно - нет удаляемой строчки, т.е. все функции внешне делают всё идеально(за исключением вставки перевода строки). Но программа продолжает вылетать, предлагая стандартное виндуусовское "отправлять отчёт".

Подпись ошибки:
AppName: adddel.exe AppVer: 0.0.0.0 ModName: msvcrt.dll
ModVer: 7.0.2600.2180 Offset: 000360cb

ради интереса вывела на печать переменную i каждого прохода while.
Печатает при количестве в 4 строки.
i=0; i=1; i=2; i=3; i=
т.е. оно лишний раз заходит в цикл, но не доходит до конца
(не считает i лишний раз, но начинает выполнять цикл)
как избавиться от этого?

p.s. можно считывать по строчкам, в строке ТОЧНО менее 100 символов.
system("PAUSE"); /*GOT MILK?*/
_Dis_ вне форума Ответить с цитированием
Старый 28.08.2009, 08:31   #6
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Если никто не против я свои пять коп. вставлю всетки...:
Код:
//---------------------------------------------------------------------------

#pragma hdrstop

#include <tchar.h>
#include <stdio.h>
//---------------------------------------------------------------------------

#pragma argsused
int _tmain(int argc, _TCHAR* argv[])
{
 FILE *f,*e;
 int i=3;// номер удаляемой строки начиная с нуля
 char c;
 if ((f=fopen("c:\\temp\\file1.txt","r"))!=NULL) {
  e=fopen("c:\\temp\\file2.txt","w+");
  do{
   c=fgetc(f);
   i-=(c=='\n')?1:0;
   if (i!=0) {fputc(c,e);}
  }while(c!=EOF);
 }
 fcloseall();
	return 0;
}
//---------------------------------------------------------------------------
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.08.2009, 10:46   #7
_Dis_
 
Аватар для _Dis_
 
Регистрация: 27.08.2009
Сообщений: 8
По умолчанию

Спасибо, но это злой рок.) Вроде всё верно,НО теперь оно влетает, если удалить всех. Добавила проверку, вообще сразу Can't open file...
Код:
void edit_student(int number)
{  
 int qstud1 = countStudents(); //подсчитывает ко-во строк в файле
  if(qstud1==1); {remove("studfile.txt");return;} //если осталась одна редактируемая строка,то удаляет файл
 if ((f = fopen("studfile.txt","r"))!=NULL) 
{
 f1 = fopen("studfile1.txt","w+"); 
 int i=number-1;//т.к. выбор пользователя нумеруется с 1
 char c;
  do
{
   c=fgetc(f);
   i-=(c=='\n')?1:0;
   if (i!=0) {fputc(c,f1);}
  }
while(c!=EOF); 
 fclose(f);
 fclose(f1);
 remove("studfile.txt");
  char *oldname, *newname;
  oldname = "studfile1.txt";
  newname = "studfile.txt";
  rename(oldname, newname);
}
 else printf("Can't open file...");   
 return;
}
system("PAUSE"); /*GOT MILK?*/

Последний раз редактировалось _Dis_; 28.08.2009 в 10:49.
_Dis_ вне форума Ответить с цитированием
Старый 28.08.2009, 11:21   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

У меня ничего не вылетает ( я про свой пример)
А по поводу пустого файла:
Код:
   if ((i!=0)&&(c!=EOF)) {fputc(c,e);}
Твой пример не разбирал. извини я в Си плохо пока что чужой код понимаю...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 28.08.2009, 11:35   #9
_Dis_
 
Аватар для _Dis_
 
Регистрация: 27.08.2009
Сообщений: 8
По умолчанию

Значит в этой функции ошибки теперь нет. Спасибо большое!
Буду искать ошибку в остальных 500 строках.:wall:
system("PAUSE"); /*GOT MILK?*/
_Dis_ вне форума Ответить с цитированием
Старый 28.08.2009, 12:15   #10
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
в остальных 500 строках
Пуфффф.... Не завидую...
I'm learning to live...
Stilet вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ошибка при удалении символа Virus191288 Общие вопросы Delphi 13 15.08.2009 14:50
в последней строчке ошибка! почему?? (Pascal) -=t-r-a-s-h=- Помощь студентам 6 02.06.2009 17:11
Определение номера последней строки выделенного диапазона НеВа6464 Microsoft Office Excel 2 17.05.2009 14:36
Ошибка при удалении... JRcoker Общие вопросы Delphi 8 29.07.2008 22:53
Проблемы при удалении файлов Pavel55 Общие вопросы Delphi 7 10.01.2008 00:45