2009-06-11 2 views
0

Я нашел исходный файл C++, который вычисляет выражения из аргумента командной строки (argv [1]), однако теперь я хочу изменить его для чтения файла.C++ - конвертировать ФАЙЛ * в CHAR *

double Utvardering(char* s) { 
srcPos = s; 
searchToken(); 
return PlusMinus(); 
} 

int main(int argc, char* argv[]) { 
if (argc > 1) { 
    FILE* fFile = fopen(argv[1], "r"); 
    double Value = Utvardering(fopen(argv[1], "r")); 
    cout << Value << endl; 
}else{ 
    cout << "Usage: " << argv[0] << " FILE" << endl; 
} 
cin.get(); 
return 0; 
} 

Однако для функции Utvardering требуется параметр char *. Как преобразовать данные, считанные из файла, fopen to char *?

+0

Вид смешной, но я подозреваю, что Utvardering() должен быть шведским Utvärdering(), что означает Evaluation(). Не часто вы видите шведские слова в коде, и особенно не на SO :) – ralphtheninja

ответ

5

Функция fopen просто открывает файл. Чтобы получить строку оттуда, вам нужно прочитать файл. Для этого есть разные способы. Если вы знаете максимальный размер вашей строки заранее, это будет делать:

const int MAX_SIZE = 1024; 
char buf[MAX_SIZE]; 
if (!fgets(buf, MAX_SIZE, fFile) { 
    cerr << "Read error"; 
    exit(1); 
} 
double Value = Utvardering(buf); 

Примечание: этот метод является типичным для C, а не C++. Если вы хотите больше идиоматических C++ код, вы можете использовать что-то вроде этого (вместо файла и FOPEN):

ifstream in;  
in.open(argv[1]); 
if (!in) { /* report an error */ } 
string str; 
in >> str; 
+0

Где объявляется MAX_SIZE? –

+0

Вы можете объявить MAX_SIZE как константу либо в теле функции, либо снаружи, в качестве глобальной константы. Обычно чем меньше помех в глобальном пространстве имен, тем лучше, поэтому просто помещаем его в основную функцию. Я обновил этот пример, см. Выше. –

+0

Первый пример не устанавливает его в char *, любые идеи? –

1

Я понятия не имею, что ожидает «Utvardering», или как он использует информацию.

Есть две возможности -

1) Utvardering может быть определена с использованием символ *, но ожидая FILE * (в действительности, лечение полукокса * как пустоты *). Я видел это раньше, хотя это довольно ужасная практика. В этом случае просто отрисуйте fFile на char * и передайте его.

2) Учреждение может ожидать нулевую завершенную строку (char *) в качестве входных данных. Если вы используете fopen, как это, вы можете использовать fread для чтения содержимого файла в буфер (char []) и передать его функции, которая принимает char *.

6

Используйте функцию fread() для чтения данных из файла FILE * в буфер. Отправьте этот буфер в Utvardering().

+0

запомнить fclose() это потом! –

0

Похоже, вам нужно написать код для чтения файла в массив символов и передать его Utvardering.

Передача возвращаемого значения fopen приведет к тому, что адрес непрозрачной структуры данных, на который указывает этот указатель, будет передан в Utvardering. Utvardering с радостью обрабатывают эти байты как символьные данные, если они не являются. Нехорошо.

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