ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > ИНФО > Статьи > Авторские статьи
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Работа с файлами в С/С++
  #1  
Старый 25.12.2006, 21:06
Аватар для Robin_Hood
Robin_Hood
Участник форума
Регистрация: 30.10.2006
Сообщений: 238
Провел на форуме:
966901

Репутация: 444
Отправить сообщение для Robin_Hood с помощью ICQ
По умолчанию Работа с файлами в С/С++

Я думаю, многие встречались с необходимостью совершать различные операции с файлами как-то копирование или удаление, переименование, запись в файл . В этой статье я попытаюсь рассказать, как можно реализовать на С и С++.
Начнем, пожалуй, с простого переименования файлов:
Первый пример на С


Код:
#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.)
 
Ответить с цитированием

  #2  
Старый 25.12.2006, 21:15
Аватар для tclover
tclover
Banned
Регистрация: 13.12.2005
Сообщений: 1,091
Провел на форуме:
9751364

Репутация: 1847


По умолчанию

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

PS fflush,fgets, fputs ?
 
Ответить с цитированием

  #3  
Старый 25.12.2006, 21:15
Аватар для sni4ok
sni4ok
Участник форума
Регистрация: 04.11.2006
Сообщений: 150
Провел на форуме:
1174659

Репутация: 175
Отправить сообщение для sni4ok с помощью ICQ
По умолчанию

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

Последний раз редактировалось sni4ok; 25.12.2006 в 21:23..
 
Ответить с цитированием

  #4  
Старый 25.12.2006, 21:38
Аватар для _Great_
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

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

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

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

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

Последний раз редактировалось _Great_; 25.12.2006 в 21:41..
 
Ответить с цитированием

  #5  
Старый 26.12.2006, 00:09
Аватар для sni4ok
sni4ok
Участник форума
Регистрация: 04.11.2006
Сообщений: 150
Провел на форуме:
1174659

Репутация: 175
Отправить сообщение для sni4ok с помощью ICQ
По умолчанию

Цитата:
Сообщение от _Great_  
Мало того, примеры, которые якобы на Си у тебя написаны, на самом деле написаны на С++! Используются возможности плюсов.
подтверждения этих слов я не обнаружил.
 
Ответить с цитированием

  #6  
Старый 26.12.2006, 00:33
Аватар для _Great_
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

Цитата:
for (count = 0; count < 5; count++)

{, data[count]);
fprintf(fp, "\ndata[%d] = %f", count, data[count]);
тут вообще синтаксис нарушен.

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

Последний раз редактировалось _Great_; 26.12.2006 в 00:38.. Причина: туплю вечером)
 
Ответить с цитированием

  #7  
Старый 26.12.2006, 00:51
Аватар для Xex
Xex
Banned
Регистрация: 10.07.2005
Сообщений: 224
Провел на форуме:
1062041

Репутация: 50
По умолчанию

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

  #8  
Старый 26.12.2006, 08:42
Аватар для _Great_
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

А кто тут выкладывает вырезки из учебника кроме этой темы?
 
Ответить с цитированием

  #9  
Старый 26.12.2006, 10:21
Аватар для Zadoxlik
Zadoxlik
Постоянный
Регистрация: 28.02.2005
Сообщений: 853
Провел на форуме:
3369632

Репутация: 749


По умолчанию

Цитата:
Сообщение от Robin_Hood  
В С++ же, используется другая функция:
5 баллов!!!!!!!

Последний раз редактировалось Zadoxlik; 26.12.2006 в 10:24..
 
Ответить с цитированием

  #10  
Старый 26.12.2006, 11:02
Аватар для _Great_
_Great_
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме:
5339610

Репутация: 4360


Отправить сообщение для _Great_ с помощью ICQ
По умолчанию

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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Юмор: Кто сказал что у админов халявная работа? silveran Болталка 7 21.07.2007 02:37
Работа с файлами в виндах (ошибка?) D3s Windows 9 13.07.2006 06:24



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ