PDA

Просмотр полной версии : Работа с файлами в С/С++


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.)

tclover
25.12.2006, 21:15
Тема-то маленькая (не большая), мог бы и описать функции поподробнее, а не вывалить кучу примеров :)
Больше похоже на шпаргалку, а не на статью :)

PS fflush,fgets, fputs ?

sni4ok
25.12.2006, 21:15
к чему ты всё это написал?
уж копирование то файла, я думаю совершенно любой человек сможет сам реализовать, почитав доку пару минут, по мимо этого в с++ нету никакой стандартной функции под именем "CopyFile", зато есть кросплатформенная либа, boost::filesystem, которая позволяет делать много замечательных вещей с файлами и дирикториями, и копировать их в том числе.
Короче говоря за неадекватность и некорректность писанины тебе -.
//жалко, что немогу ставить минус.

_Great_
25.12.2006, 21:38
Ты че наркоман?? Что курил-то?
DeleteFile,CreateFile,CopyFile никак не связаны с С/С++. Это Win32 API!
Иди читай мануалы. Низачот.

Для копирования файлов в С, в отличие от С++ не предусмотрено библиотечных функций, поэтому придется писать свою:
ндаааа..

Мало того, примеры, которые якобы на Си у тебя написаны, на самом деле написаны на С++! Используются возможности плюсов.

иопт, даже потерял дар речи. звиздец.

sni4ok
26.12.2006, 00:09
Мало того, примеры, которые якобы на Си у тебя написаны, на самом деле написаны на С++! Используются возможности плюсов.


подтверждения этих слов я не обнаружил.

_Great_
26.12.2006, 00:33
for (count = 0; count < 5; count++)

{, data[count]);
fprintf(fp, "\ndata[%d] = %f", count, data[count]);

тут вообще синтаксис нарушен.

насчет сборки я ступил слегка)

Xex
26.12.2006, 00:51
а мне вообще интересно, зачемнаэтом форуме выкладывать вырезки из учебника? Давайте может напишем статью: "ie - это просто!"

_Great_
26.12.2006, 08:42
А кто тут выкладывает вырезки из учебника кроме этой темы?

Zadoxlik
26.12.2006, 10:21
В С++ же, используется другая функция:

5 баллов!!!!!!! :D :D :D :D

_Great_
26.12.2006, 11:02
Угу, я тоже заценил :) Остальные перлы не хуже:
Для копирования файлов в С, в отличие от С++ не предусмотрено библиотечных функций, поэтому придется писать свою:
:d :d :d