Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Авторские статьи (https://forum.antichat.xyz/forumdisplay.php?f=31)
-   -   Работа с файлами в С/С++ (https://forum.antichat.xyz/showthread.php?t=29883)

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_
Мало того, примеры, которые якобы на Си у тебя написаны, на самом деле написаны на С++! Используются возможности плюсов.

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

_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

Цитата:

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

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

_Great_ 26.12.2006 11:02

Угу, я тоже заценил :) Остальные перлы не хуже:
Цитата:

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


Время: 21:59