2010-07-25 3 views
1

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

#include <fstream> 
FILE * yhtit; 
yhtit = fopen("thefile.txt","r"); 
int main() { 
return 0; } 

дает ошибку: main.cpp|54|error: expected constructor, destructor, or type conversion before ‘=’ token|

Что лучший способ сохранить файл открыть всю продолжительность программы, без необходимости раздельной передачи FILE * объект для каждой функции, которая в ней нуждается?

+0

С помощью этого файла вы используете FILE *, это действительно вопрос C, а не вопрос на C++. –

+0

Вы должны перенести указатель FILE * в класс Singleton Logging и сделать его лениво инициализированным. Эффективно сводится к наличию глобального (singleton) объекта, но его гораздо более аккуратный, если вы используете 'Singleton' (по сравнению с использованием' global FILE * '. – bits

+0

@bits: как класс Singleton Logging помогает с функциональностью, где" несколько функций ... нужно читать данные из файла »? Кроме того, почему одноэлемент« более аккуратный », чем глобальный? Пытаясь сделать объект, похожий на FILE *, синглтон кажется злоупотреблением синглом, так как это явно что нужно делать, чтобы иметь возможность открывать несколько файлов в одной программе. –

ответ

7

Вы почти правильно поняли. Попробуйте это:

#include <fstream> 

FILE * yhtit; 

int main() { 
    yhtit = fopen("thefile.txt","r"); 

    //Do your thing here. 

    fclose(yhtit); 
    return 0; 
} 
+0

-1 для решения глобальных переменных. – Dacav

+7

Справедливости ради следует, что глобальное переменное решение было вопросом, на который задавался этот вопрос. – wrosecrans

+0

Спрятанное нижнее ноль – syb0rg

0
#include <fstream> 
FILE * yhtit = fopen("thefile.txt","r"); 
int main() { 
    return 0; } 
+0

-1 для решения глобальной переменной – Dacav

+0

@ Dacav: глобальная переменная является частью вопроса. SCFrench не представил ее в своем решении, он просто зафиксировал свою инициализацию. –

4

Было бы лучше, чтобы передать FILE указатель на ваши функции, чем создать глобальную переменную. Глобальные переменные часто кодируют запахи — признаки сомнительной кодировки. Вы можете передать файл своим функциям, не открывая и не закрывая файл несколько раз. Например:

#include <stdio.h> 

void readData(FILE *); 
void readMoreData(FILE *); 

int main() { 
    FILE *fp = fopen("...", "r"); 

    readData(fp); 
    readMoreData(fp); 

    fclose(fp); 
    return 0; 
} 
+0

Y Я согласен с тем, что это спорная практика и исправление, которое входит в мой список дел, но на данный момент я просто пытаюсь заставить эту работу работать. – tsiki

+1

@tziki: это не большое дело, передавая еще один аргумент в список параметров. Размещение глобальной переменной на самом деле является плохой идеей и даст вам трудное время, когда вам понадобится изменить исходный код в будущем (особенно многопоточность, а также глобальные переменные трудно отследить при анализе программы!) – Dacav

-1

Вы можете сохранить File * переменные в структуре и сделать эту структуру доступной из любой функции.

typedef struct 
{ 
FILE *fp; 
//other members can also be part of this structure. 
}myData; 

appInit(myData *ptr) 
{ 
ptr->fp = fopen(<>,<>); 
//Initialise other variables also 

return; 
} 

appDeInit(myData *ptr) 
{ 

fclose(ptr->fp); 
} 


main() 
{ 
myData *ptr= malloc(sizeof(myData)); 
appInit(ptr); 
//Play with ptr in all your function calls 
foo(ptr); 


appDeInit(myData); 
} 
Смежные вопросы