C ++ fprintf над многими функциями в одном текстовом файле - PullRequest
0 голосов
/ 07 декабря 2010

У меня проблемы с печатью в текстовый файл из выбранных мест в большом проекте с кодом C ++.

Использование C++ Я использую функцию X, которая вызывается несколько раз.

Это вызывается из функции Y

Я хочу вывести результаты функции X в один текстовый файл и делал это непрерывно, используя объявления, fopen, fprintf,fclose набор функций - это работает - хотя и очень медленно.

Однако я хочу печатать результаты в файл только при вызове X из определенной области функции хоста Y.

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

Являются ли они способом уникальных способов эффективно «сообщить» коду и дочерним функциям, когда начинать печать в файл, а когда останавливать.

(ps Я постобработал свои результаты с использованием VBA, однако этот обходной путьпризнано неэффективным).

Любые идеи или конструкции кода приветствуются!

swarm

Ниже представлена ​​дочерняя функция X:

void `X`() {    
    FILE *f2 = NULL;     
    f2 = fopen("log.txt", "a");     
    // Calculate a result: `result`    
    fprintf(f2, "%.4e   ", result);    
    fclose (f2);
}

Ниже приведена основная вызывающая функция Y:

void Y Y(){    
    for i=1:100{    
        X();      
        X();      
        X(); // <-- Wishing to print only this line to a text file
    }
}

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

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

У вас есть

  void X(args);

Добавить

  void X(args, bool doIt);

Затем переместите код в исходном X на новый, проверяя doIt.

В исходном Х звоните X(args, false)

Каким-то образом должно быть передано логическое состояние фактической регистрации. Возможные варианты: аргумент, глобальная переменная, переменная-член (статическая или экземплярная), локальная переменная потока или файл.

0 голосов
/ 07 декабря 2010

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

Как вы храните указатель FILE * между вызовами X? Глобальный? переменная в функции?

0 голосов
/ 07 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...