| Robin_Hood |
25.12.2006 21:06 |
Работа с файлами в С/С++
Я думаю, многие встречались с необходимостью совершать различные операции с файлами как-то копирование или удаление, переименование, запись в файл . В этой статье я попытаюсь рассказать, как можно реализовать на С и С++.
Начнем, пожалуй, с простого переименования файлов:
Первый пример на С
Код:
#include <stdio.h>
int main( void )
{
/* Переменные*/
char oldname[80], newname[80];
/* Ввод начального имени файла*/
printf("Enter current filename: ");
gets(oldname);
/* Ввод нового имени файла*/
printf("Enter new name for file: ");
gets(newname);
/*Процедура переименования */
if ( rename( oldname, newname ) == 0 )
printf("%s has been renamed %s.\n", oldname, newname);
else
/*Ошибка */
fprintf(stderr, "An error has occurred renaming %s.\n", oldname);
return 0;
}
Для копирования файлов в С, в отличие от С++ не предусмотрено библиотечных функций, поэтому придется писать свою:
Код:
#include <stdio.h>
int file_copy( char *oldname, char *newname );
int main( void )
{
char source[80], destination[80];
/* Получить начальное имя и конечное имя*/
printf("\nEnter source file: ");
gets(source);
printf("\nEnter destination file: ");
gets(destination);
/* Операция копирования*/
if ( file_copy( source, destination ) == 0 )
puts("Copy operation successful");
else
fprintf(stderr, "Error during copy operation");
return(0);
}
/* Сама функция копирования*/
int file_copy( char *oldname, char *newname )
{
FILE *fold, *fnew;
int c;
if ( ( fold = fopen( oldname, "rb" ) ) == NULL )
return -1;
if ( ( fnew = fopen( newname, "wb" ) ) == NULL )
{
fclose ( fold );
return -1;
}
/* Считывается файл по одному байту,
/*пока не встретится завершающий символ */
while (1)
{
c = fgetc( fold );
if ( !feof( fold ) )
fputc( c, fnew );
else
break;
}
fclose ( fnew );
fclose ( fold );
return 0;
В С++ же, функция CopyFile – библиотечная, что видно в следующем примере:
Код:
#include <windows.h>
#include <iostream.h>
int main()
{
// копируем файл
if(!CopyFile("C:\\demo_file.dat", "C:\\new_file.dat", FALSE))
{
cerr << "Copy file failed." << endl
<< "The last error code: " << GetLastError() << endl;
cout << "Press any key to finish.";
cin.get();
return 0;
}
cout << "The file is copied." << endl;
return 0;
}
Далее мы рассмотрим варианты удаления файла, сначала на С:
Код:
#include <stdio.h>
int main( void )
{
char filename[80];
printf("Enter the filename to delete: ");
gets(filename);
/* Удаление */
if ( remove(filename) == 0)
printf("The file %s has been deleted.\n", filename);
else
fprintf(stderr, "Error deleting the file %s.\n", filename);
return 0;
}
Функция DeleteFile в С++ имеет похожее применение:
Код:
#include <windows.h>
#include <iostream.h>
int main()
{
// удаляем файл
if(!DeleteFile("C:\\demo_file.dat"))
{
cerr << "Delete file failed." << endl
<< "The last error code: " << GetLastError() << endl;
cout << "Press any key to finish.";
cin.get();
return 0;
}
cout << "The file is deleted." << endl;
return 0;
}
Когда же нужно записать информацию в файл на С, используется функция fprintf:
Код:
#include <stdlib.h>
#include <stdio.h>
void clear_kb(void);
int main( void )
{
FILE *fp;
char data[50];
int count;
char filename[20];
puts("Enter someting to wrtie into.");
gets(data);
clear_kb();
puts("Enter a name for the file.");
gets(filename);
if ( (fp = fopen(filename, "w")) == NULL)
{
fprintf(stderr, "Error opening file %s.", filename);
exit(1);
}
for (count = 0; count < 5; count++)
{, data[count]);
fprintf(fp, "\ndata[%d] = %f", count, data[count]);
fprintf(stdout, "\ndata[%d] = %f", count, data[count]); }
fclose(fp);
printf("\n");
return 0;
}
void clear_kb(void)
{
char junk[80];
gets(junk);
}
В С++ же, используется другая функция:
Код:
#include <windows.h>
#include <iostream.h>
int main()
{
HANDLE hFile;
// создаем файл для записи данных
hFile = CreateFile(
"C:\\demo_file.dat", // имя файла
GENERIC_WRITE, // запись в файл
0, // монопольный доступ к файлу
NULL, // защиты нет
CREATE_NEW, // создаем новый файл
FILE_ATTRIBUTE_NORMAL, // обычный файл
NULL // шаблона нет
);
// проверяем на успешное создание
if (hFile == INVALID_HANDLE_VALUE)
{
cerr << "Create file failed." << endl
<< "The last error code: " << GetLastError() << endl;
cout << "Press any key to finish.";
cin.get();
return 0;
}
// пишем данные в файл
for (int i = 0; i < 10; ++i)
{
DWORD dwBytesWrite;
if (!WriteFile(
hFile, // дескриптор файла
&i, // адрес буфера, откуда идет запись
sizeof(i), // количество записываемых байтов
&dwBytesWrite, // количество записанных байтов
(LPOVERLAPPED)NULL // запись синхронная
))
{
cerr << "Write file failed." << endl
<< "The last error code: " << GetLastError() << endl;
CloseHandle(hFile);
cout << "Press any key to finish.";
cin.get();
return 0;
}
}
// закрываем дескриптор файла
CloseHandle(hFile);
cout << "The file is created and written." << endl;
return 0;
}
Ну вот собственно и все, to be continued.)
|