C ++ - конвертировать FILE * в CHAR * - PullRequest
0 голосов
/ 12 июня 2009

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

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 в char *?

Ответы [ 5 ]

6 голосов
/ 12 июня 2009

Функция 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 ++, вы можете использовать что-то вроде этого (вместо FILE и fopen):

ifstream in;    
in.open(argv[1]); 
if (!in) { /* report an error */ }
string str;
in >> str;
6 голосов
/ 12 июня 2009

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

1 голос
/ 12 июня 2009

Понятия не имею, что ожидает "Утвардинг" или как он использует информацию.

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

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

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

0 голосов
/ 12 июня 2009

Хороший пример чтения данных из файла здесь: http://www.cplusplus.com/reference/clibrary/cstdio/fread/ затем передайте буфер вашей функции

0 голосов
/ 12 июня 2009

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

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

...