2009-02-26 1 views

ответ

17

Не имеет значения, является ли оно локальным или глобальным. Объем указателя файла не имеет никакого отношения к его использованию.

В целом, рекомендуется избегать глобальных переменных как можно больше.

Вот образец, показывающий, как скопировать из input.txt в output.txt:

#include <stdio.h> 
int main (void) { 
    FILE *fin; 
    FILE *fout; 
    int c; 

    fin = fopen ("input.txt", "r"); 
    if (fin != NULL) { 
     fout = fopen ("output.txt", "w"); 
     if (fout != NULL) { 
      c = fgetc (fin); 
      while (c >= 0) { 
       fputc (c, fout); 
       c = fgetc (fin); 
      } 
      fclose (fout); 
     } else { 
      fprintf (stderr, "Cannot write to output.txt"); 
     } 
     fclose (fin); 
    } else { 
     fprintf (stderr, "Cannot read from input.txt"); 
    } 
    return 0; 
} 
4

Это обычный указатель, как и любой другой.

FILE *CreateLogFile() 
{ 
    return fopen("logfile.txt","w"); // allocates a FILE object and returns a pointer to it 
} 

void UsefulFunction() 
{ 
    FILE *pLog = CreateLogFile(); // it's safe to return a pointer from a func 
    int resultsOfWork = DoSomeWork(); 
    fprintf(pLog, "Work did %d\n", resultsOfWork); // you can pass it to other functions 
    fclose(pLog); // just be sure to clean it up when you are done with fclose() 
    pLog = NULL; // and it's a good idea to overwrite the pointer afterwards 
        // so it's obvious you deleted what it points to 
} 
1
int main(void) 
{ 
    char c; 
    FILE *read; 
    read = fopen("myfile", "r"); // opens "myfile" for reading 
    if(read == NULL) 
    { 
    perror("Error: could not open \"myfile\" for reading.\n"); 
    exit(1); 
    } 
    c = fgetc(read); 
    fclose(read); 
    printf("The first character of myfile is %c.\n", c); 
    return 0; 
} 

Вы совершенно разрешено объявлять глобальные дескрипторы файлов, если вы хотите, как и любой другой переменной, но оно не может быть рекомендовано.

Это путь C. C++ может использовать это, но я думаю, что есть более удобный для C++ способ сделать это. В качестве примечания, я ненавижу, когда вопросы отмечены как C/C++, потому что C и C++ являются не на том же языке и делают не работают одинаково. У C++ есть много разных способов сделать то, что C не имеет, и вам может быть проще сделать это в контексте C++, но они не являются допустимыми C. Поэтому, хотя это будет работать для любого языка, это не то, что вы хотите, если вы преимущественно используете C++.

EDIT: добавлена ​​некоторая проверка ошибок. Всегда используйте проверку ошибок в своем коде.

0

Во-первых, имейте в виду, что указатель файла (и связанная с ним распределенная структура) основан на вызовах read() write() более низкого уровня. Связанный файловый дескриптор (полученный fileno (file_pointer) является наименее интересной вещью, но вы можете захотеть посмотреть свою область с помощью.

Если вы собираетесь объявить указатель на файл как глобальный в модуле, его обычно очень хорошая идея сохранить его статичным (содержащимся в этом модуле/объектном файле). Иногда это немного проще, чем хранить его в структуре, переданной из функции, чтобы функционировать, если вам нужно что-то спешить.

Для экземпляр, (плохо)

#include <stdio.h> 
#include ... 

#define MY_LOG_FILE "file.txt" 

FILE *logfile 

Лучше сделать так:

#include <stdio.h> 

#define MY_LOG_FILE "file.txt" 

static FILE *logfile; 

int main(void) 
{ 

НЕОБХОДИМ, вам нужно несколько модулей, чтобы иметь доступ к этому указателю, и в этом случае вам лучше разместить его в структуре, которая может быть передана.

Если это необходимо только в одном модуле, рассмотрите его объявление в main() и разрешите другим функциям принимать указатель файла в качестве аргумента. Итак, если ваши функции внутри модуля не имеют так много аргументов, что другой будет невыносимым .. есть (обычно) нет причин объявлять указатель файла глобально.

Некоторые библиотеки журналов делают это, что мне не важно ... особенно при работе с функциями повторного входа. Монолитическое пространство Nevermind C :)