Авторские статьи Работа с файлами в С/С++

Discussion in 'Статьи' started by Robin_Hood, 25 Dec 2006.

  1. Robin_Hood

    Robin_Hood Elder - Старейшина

    Joined:
    30 Oct 2006
    Messages:
    144
    Likes Received:
    155
    Reputations:
    47
    Я думаю, многие встречались с необходимостью совершать различные операции с файлами как-то копирование или удаление, переименование, запись в файл . В этой статье я попытаюсь рассказать, как можно реализовать на С и С++.
    Начнем, пожалуй, с простого переименования файлов:
    Первый пример на С


    Code:
    #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;
    }
    Для копирования файлов в С, в отличие от С++ не предусмотрено библиотечных функций, поэтому придется писать свою:


    Code:
    #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 – библиотечная, что видно в следующем примере:

    Code:
    #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;
    }
    Далее мы рассмотрим варианты удаления файла, сначала на С:

    Code:
    #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 в С++ имеет похожее применение:

    Code:
    #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:

    Code:
    #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);
    }
    В С++ же, используется другая функция:


    Code:
    #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.)
     
    1 person likes this.
  2. tclover

    tclover nobody

    Joined:
    13 Dec 2005
    Messages:
    741
    Likes Received:
    682
    Reputations:
    287
    Тема-то маленькая (не большая), мог бы и описать функции поподробнее, а не вывалить кучу примеров :)
    Больше похоже на шпаргалку, а не на статью :)

    PS fflush,fgets, fputs ?
     
    1 person likes this.
  3. sni4ok

    sni4ok Elder - Старейшина

    Joined:
    4 Nov 2006
    Messages:
    115
    Likes Received:
    37
    Reputations:
    12
    к чему ты всё это написал?
    уж копирование то файла, я думаю совершенно любой человек сможет сам реализовать, почитав доку пару минут, по мимо этого в с++ нету никакой стандартной функции под именем "CopyFile", зато есть кросплатформенная либа, boost::filesystem, которая позволяет делать много замечательных вещей с файлами и дирикториями, и копировать их в том числе.
    Короче говоря за неадекватность и некорректность писанины тебе -.
    //жалко, что немогу ставить минус.
     
    #3 sni4ok, 25 Dec 2006
    Last edited: 25 Dec 2006
    1 person likes this.
  4. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Ты че наркоман?? Что курил-то?
    DeleteFile,CreateFile,CopyFile никак не связаны с С/С++. Это Win32 API!
    Иди читай мануалы. Низачот.

    ндаааа..

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

    иопт, даже потерял дар речи. звиздец.
     
    #4 _Great_, 25 Dec 2006
    Last edited: 25 Dec 2006
    1 person likes this.
  5. sni4ok

    sni4ok Elder - Старейшина

    Joined:
    4 Nov 2006
    Messages:
    115
    Likes Received:
    37
    Reputations:
    12
    подтверждения этих слов я не обнаружил.
     
  6. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    тут вообще синтаксис нарушен.

    насчет сборки я ступил слегка)
     
    #6 _Great_, 25 Dec 2006
    Last edited: 25 Dec 2006
  7. Xex

    Xex Banned

    Joined:
    10 Jul 2005
    Messages:
    108
    Likes Received:
    41
    Reputations:
    7
    а мне вообще интересно, зачемнаэтом форуме выкладывать вырезки из учебника? Давайте может напишем статью: "ie - это просто!"
     
    1 person likes this.
  8. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    А кто тут выкладывает вырезки из учебника кроме этой темы?
     
  9. Zadoxlik

    Zadoxlik рояль с сыром

    Joined:
    28 Feb 2005
    Messages:
    758
    Likes Received:
    216
    Reputations:
    257
    5 баллов!!!!!!! :D :D :D :D
     
    #9 Zadoxlik, 26 Dec 2006
    Last edited: 26 Dec 2006
  10. _Great_

    _Great_ Elder - Старейшина

    Joined:
    27 Dec 2005
    Messages:
    2,032
    Likes Received:
    1,119
    Reputations:
    1,139
    Угу, я тоже заценил :) Остальные перлы не хуже:
    :d :d :d