2009-05-05 1 views
0

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

Т.е.:

[data.txt] 
1020 
[convert_data.cpp] 
#include<fstream> 
fstream convert("data.txt"); 
//way to declare something equal to A PARTICULAR POINT in data.txt 

int main() 
{ 
    //how would I take this block of code and simplify it to two DECLARATIONS (not 
    //function calls), or, if that's not possible or not practical, how would I make 
    //n and m (or var1 and var2) global AND CONSTANT? 
    char var1[5]; 
    convert.getline(var1,2); 
    char var2[5]; 
    convert.getline(var2,2); 
    const int n=atoi(var1); 
    const int m=atoi(var2); 
    return 0; 
} 

ответ

0

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

+0

На самом деле создание функции, используемой в глобальной декларации, возможно именно в том, что мне нужно (оксюморон не предназначен). – 2009-05-05 04:16:09

0

С точки зрения компилятора, A константа является то, что имеет фиксированное значение во время компиляции. Поскольку вы читаете данные из текстового файла (который может быть изменен после компиляции программы), числа, которые вы читаете из текстового файла, не могут быть константами в вашей программе.

Сказав, что вы могли сделать что-то вроде этого:

class ConstInteger { 
public: 
    ConstInteger(fstream &f) { 
     char s[5]; 
     f.getline(s,2); 
     value = atoi(s); 
    } 
    public operator int() const { return value; } 
private: 
    int value; 
}; 

fstream convert("data.txt"); 
ConstInteger n(convert); 

выше опирается на инициализации компилятор C++ делает для глобальных классов. Вследствие этого вы в значительной степени находитесь во власти компилятора C++ в отношении порядка инициализации класса. Кроме того, обработка ошибок в этой компоновке может быть проблематичной. (Например, что произойдет, если data.txt не существует?)

+0

Не совсем верно, так как приведенный выше код имел n и m bothe, являющиеся константами, и оба считываются из файла. Я просто ищу способ сократить это в единую декларацию и сделать ее глобальной. – 2009-05-05 04:14:20

+0

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

+0

В пределах одной единицы перевода гарантируется стандартом C++, что глобальные конструкторы вызываются в том порядке, в котором они объявлены. –

0

Если я правильно понял, вы хотите прочитать часть текстового файла и сохранить значение как константу? Ну, у вас не может быть неинициализированной константы, поэтому глобальная декларация, которую вы назначаете во время выполнения.

Возможно, способ сделать это - инкапсулировать ту функциональность, которая у вас есть в глобальной функции, называемой getConstant, это может содержать статическую переменную, и вызов getConstant проверяет, был ли var прочитан из файла, если это затем возвращает константу, если она не читается в файле. Ленькая оценка. Конечно, это не решает вопрос о необходимости постоянного (?) Быть постоянным.

Смежные вопросы