Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |

25.12.2006, 21:06
|
|
Участник форума
Регистрация: 30.10.2006
Сообщений: 238
Провел на форуме: 966901
Репутация:
444
|
|
Работа с файлами в С/С++
Я думаю, многие встречались с необходимостью совершать различные операции с файлами как-то копирование или удаление, переименование, запись в файл . В этой статье я попытаюсь рассказать, как можно реализовать на С и С++.
Начнем, пожалуй, с простого переименования файлов:
Первый пример на С
Код:
#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.)
|
|
|

25.12.2006, 21:15
|
|
Banned
Регистрация: 13.12.2005
Сообщений: 1,091
Провел на форуме: 9751364
Репутация:
1847
|
|
Тема-то маленькая (не большая), мог бы и описать функции поподробнее, а не вывалить кучу примеров 
Больше похоже на шпаргалку, а не на статью
PS fflush,fgets, fputs ?
|
|
|

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

25.12.2006, 21:38
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Ты че наркоман?? Что курил-то?
DeleteFile,CreateFile,CopyFile никак не связаны с С/С++. Это Win32 API!
Иди читай мануалы. Низачот.
Для копирования файлов в С, в отличие от С++ не предусмотрено библиотечных функций, поэтому придется писать свою:
ндаааа..
Мало того, примеры, которые якобы на Си у тебя написаны, на самом деле написаны на С++! Используются возможности плюсов.
иопт, даже потерял дар речи. звиздец.
Последний раз редактировалось _Great_; 25.12.2006 в 21:41..
|
|
|

26.12.2006, 00:09
|
|
Участник форума
Регистрация: 04.11.2006
Сообщений: 150
Провел на форуме: 1174659
Репутация:
175
|
|
Сообщение от _Great_
Мало того, примеры, которые якобы на Си у тебя написаны, на самом деле написаны на С++! Используются возможности плюсов.
подтверждения этих слов я не обнаружил.
|
|
|

26.12.2006, 00:33
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
for (count = 0; count < 5; count++)
{, data[count]);
fprintf(fp, "\ndata[%d] = %f", count, data[count]);
тут вообще синтаксис нарушен.
насчет сборки я ступил слегка)
Последний раз редактировалось _Great_; 26.12.2006 в 00:38..
Причина: туплю вечером)
|
|
|

26.12.2006, 00:51
|
|
Banned
Регистрация: 10.07.2005
Сообщений: 224
Провел на форуме: 1062041
Репутация:
50
|
|
а мне вообще интересно, зачемнаэтом форуме выкладывать вырезки из учебника? Давайте может напишем статью: "ie - это просто!"
|
|
|

26.12.2006, 08:42
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
А кто тут выкладывает вырезки из учебника кроме этой темы?
|
|
|

26.12.2006, 10:21
|
|
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
Провел на форуме: 3369632
Репутация:
749
|
|
Сообщение от Robin_Hood
В С++ же, используется другая функция:
5 баллов!!!!!!! 
Последний раз редактировалось Zadoxlik; 26.12.2006 в 10:24..
|
|
|

26.12.2006, 11:02
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Угу, я тоже заценил  Остальные перлы не хуже:
Для копирования файлов в С, в отличие от С++ не предусмотрено библиотечных функций, поэтому придется писать свою:
:d :d :d
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|