удалить не работает должным образом?(из пространства имен std) - PullRequest
1 голос
/ 13 июля 2011

Через этот фрагмент я пытаюсь удалить определенный файл из каталога. Вот код для этого.

/* char* cpathToDeleteGND;  
   char* cpathToDeleteFST;
   char* cpathToDeleteSND;
 */

cout << "Enter the name to be removed : ";

cin.ignore();

getline( cin , fullName );

string pathToDeleteGND = "d:/HostelManager/studentDetails/groundFloor/" + fullName  + ".txt";

string pathToDeleteFST = "d:/HostelManager/studentDetails/firstFloor/" + fullName + ".txt";

string pathToDeleteSND = "d:/HostelManager/studentDetails/secondFloor/" + fullName + ".txt";


ifstream checkToDeleteGND( pathToDeleteGND );
ifstream checkToDeleteFST( pathToDeleteFST );
ifstream checkToDeleteSND( pathToDeleteSND );

cpathToDeleteGND = new char[ pathToDeleteGND.size() + 1 ];
cpathToDeleteFST = new char[ pathToDeleteFST.size() + 1 ];
cpathToDeleteSND = new char[ pathToDeleteSND.size() + 1 ];

strcpy( cpathToDeleteGND , pathToDeleteGND.c_str() );
strcpy( cpathToDeleteFST , pathToDeleteFST.c_str() );
strcpy( cpathToDeleteSND , pathToDeleteSND.c_str() );

if( checkToDeleteGND ) {
  if( remove( cpathToDeleteGND) == 0 ) {
   cout << "\nStudent details cleared successfully !";
  }
}  else if( checkToDeleteFST) {
    if( remove( cpathToDeleteFST) == 0 ) {
      cout << "\nStudent details cleared successfully ! ";
            }
   }  else if( checkToDeleteSND ) {
       if( remove( cpathToDeleteSND) == 0 ) {
    cout << "\nStudent details cleared successfully !";
       }
         } else {
        cout << "\nIt seems that either the student has already been removed or does not exist.";
     }

Я даю имя, которое следует удалить из каталога. Хотя блоки if if работают, но функция удаления не работает. Я не могу понять причину ..

Например, вывод выглядит так:

Enter the name to be removed : diana
Press any key to continue . . .

Файл diana.txt существовал, поэтому он не выполнил последний блок else. Но remove function не работает. Почему это?

Ответы [ 4 ]

5 голосов
/ 13 июля 2011

Файл diana.txt существовал, поэтому он не выполнил последний блок else.Но функция удаления не работает.Почему это так?

Вы не знаете, потому что вы печатаете сообщение, только если remove успешно.Попробуйте:

if (remove(pathToDeleteFST.c_str()) == 0) {
    // success, print something
} else {
    // failure, much more interesting
    cout << "Can't remove " << pathToDeleteFST << ": "
         << strerror(errno) << endl;
}

errno в errno.h, strerror в string.h.

(Вместо того, чтобы открыть файл, чтобы проверить, существует ли он, вы также можете зарядитьи попробуйте remove. Как отмечает @nm, в Windows это может даже понадобиться.)

3 голосов
/ 13 июля 2011

Вы открываете файл перед его удалением.Windows не будет удалять файлы, открытые кем-то.Не проверяйте наличие файла, открыв его, используйте stat или просто позвоните remove без проверки.

1 голос
/ 24 февраля 2017

Это очень старый вопрос, но он все еще может быть актуален для людей, которые сталкиваются с этим в поисках решения.

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

Прежде чем вы сможете remove и файлы, вы должны сначала .close() их.

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

Надеюсь, это поможет.

1 голос
/ 13 июля 2011

Есть несколько проблем с вашим кодом, но вероятная причина сбоя remove в том, что файл открыт;Windows не удалит открытый файл.Вы, вероятно, должны преобразовать многие из них в отдельные функции.Если вы используете функцию, подобную следующей, например:

bool
fileExists( std::string const& filename )
{
    return std::ifstream( filename.c_str() );
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...