У меня проблема с удалением/перезаписью файла с помощью моей программы, который также используется (читается) моей программой. Проблема, по-видимому, заключается в том, что из-за того, что моя программа считывает данные из файла (output.txt), она переводит файл в состояние «используется», что делает невозможным удаление или перезапись файла.
Я не понимаю, почему файл остается «используемым», потому что я закрываю файл после использования с помощью fclose();
это мой код:
bool bBool = true
while(bBool){
//Run myprogram.exe tot generate (a new) output.txt
//Create file pointer and open file
FILE* pInputFile = NULL;
pInputFile = fopen("output.txt", "r");
//
//then I do some reading using fscanf()
//
//And when I'm done reading I close the file using fclose()
fclose(pInputFile);
//The next step is deleting the output.txt
if( remove( "output.txt" ) == -1 ){
//ERROR
}else{
//Succesfull
}
}
Я использую fclose(), чтобы закрыть файл, но файл продолжает использоваться моей программой до тех пор, пока моя программа не будет полностью закрыта.
Каково решение для освобождения файла, чтобы его можно было удалить/перезаписать?
На самом деле мой код не является бесконечным циклом; )
Заранее спасибо!
Марко
Обновить
Например, спросите часть моего кода, которая также генерирует файл «используется». Это не цикл, и эта функция вызывается из функции main();
Вот фрагмент кода:
int iShapeNr = 0;
void firstRun()
{
//Run program that generates output.txt
runProgram();
//Open Shape data file
FILE* pInputFile = NULL;
int iNumber = 0;
pInputFile = fopen("output.txt", "r");
//Put all orientations of al detected shapes in an array
int iShapeNr = 0;
int iRotationBuffer[1024];//1024 is maximum detectable shapes, can be changed in RoboRealm
int iXMinBuffer[1024];
int iXMaxBuffer[1024];
int iYMinBuffer[1024];
int iYMaxBuffer[1024];
while(feof(pInputFile) == 0){
for(int i=0;i<9;i++){
fscanf(pInputFile, "%d", &iNumber);
fscanf(pInputFile, ",");
if(i == 1) {
iRotationBuffer[iShapeNr] = iNumber;
}
if(i == 3){//xmin
iXMinBuffer[iShapeNr] = iNumber;
}
if(i == 4){//xmax
iXMaxBuffer[iShapeNr] = iNumber;
}
if(i == 5){//ymin
iYMinBuffer[iShapeNr] = iNumber;
}
if(i == 6){//ymax
iYMaxBuffer[iShapeNr] = iNumber;
}
}
iShapeNr++;
}
fflush(pInputFile);
fclose(pInputFile);
}
Цикл while анализирует файл. Output.txt содержит наборы из 9 переменных, количество наборов неизвестно, но всегда в наборах по 9.
output.txt может содержать, например: 0,1,2,3,4,5,6,7,8,8,7,6,5,4,1,2,3,0
обновление 2
код:
void runProgram(){
//Check if output.txt exists, if so delete it
if(fileExists("output.txt") == 1){
//Delete output.txt
if( remove( "output2.txt" ) == -1 ){
//errormessage
}else{
//succesfull
}
}
//start program
ShellExecute( NULL, TEXT("open"), TEXT("program.exe"), NULL, NULL, SW_SHOWMAXIMIZED);
while(fileExists("output.txt") == 0);
//Close program
int iCheck = system("taskkill /IM program.exe");
if(iCheck != 0){
//error could not shut down
}
}
извините за использование pre снова, но я не понимаю форматирование этого сайта :(
flcose()
позаботится об этом. @Marco, как говорит @Henno Brandsma, осмотритеerrno
и посмотрите, что там написано, это может дать вам некоторые подсказки. Кстати, это помечено как C++, почему вы не используете потоки ввода-вывода?? - person Nim   schedule 12.01.2011fclose()
. - person Simone   schedule 12.01.2011fflush
в любом случае? - person Moo-Juice   schedule 12.01.2011{}
вместо кнопки pre. - person Yakov Galka   schedule 12.01.2011