Как перенаправить вывод потока printf в файл .csv?

Из датчика получим поток данных, который выглядит как последовательность кортежей:

sensor: (-0.560303, -0.627686, 0.467468)
sensor: (-0.561829, -0.626160, 0.466125)
sensor: (-0.556091, -0.623352, 0.471497)
sensor: (-0.558411, -0.625977, 0.468811)
sensor: (-0.557312, -0.626587, 0.468262)
sensor: (-0.557800, -0.625854, 0.465820)
sensor: (-0.563599, -0.624512, 0.464722)
sensor: (-0.555847, -0.623230, 0.467163)
sensor: (-0.557861, -0.621033, 0.468811)
sensor: (-0.555420, -0.625061, 0.470520)
sensor: (-0.559082, -0.626221, 0.475891)
sensor: (-0.559814, -0.625977, 0.466309)
sensor: (-0.561768, -0.624756, 0.467163)
sensor: (-0.551941, -0.628906, 0.469055)
sensor: (-0.556946, -0.626465, 0.471313)
sensor: (-0.558533, -0.626038, 0.469421)
sensor: (-0.557922, -0.625061, 0.467285)
sensor: (-0.562622, -0.623657, 0.469971)
sensor: (-0.554443, -0.625977, 0.465759)
sensor: (-0.559265, -0.626282, 0.471619)
sensor: (-0.558716, -0.625427, 0.471375)
sensor: (-0.559143, -0.626526, 0.467468)
sensor: (-0.554749, -0.626221, 0.468079)
sensor: (-0.554626, -0.622681, 0.467285)
sensor: (-0.557983, -0.625549, 0.475464)
sensor: (-0.555603, -0.626343, 0.466980)
sensor: (-0.559570, -0.625854, 0.470398)
sensor: (-0.556946, -0.626587, 0.466858)
sensor: (-0.557373, -0.626526, 0.470093)
sensor: (-0.558716, -0.629272, 0.464905)
sensor: (-0.555725, -0.625732, 0.473877)
sensor: (-0.560608, -0.626282, 0.469238)
sensor: (-0.556335, -0.626221, 0.467590)
sensor: (-0.558777, -0.623840, 0.468994)

До сих пор я печатаю все эти данные в терминал, как это:

if (sensor_data) {
mpu.readSensorData(sensor);
float ax = sensor[0] * 250.0 / 368.0;
float ay = sensor[1] * 250.0 / 368.0;
float az = sensor[2] * 250.0 / 368.0;
pc.printf("\nsensor: (%f, %f, %f)\n", ax,ay,az);
}*/wait(0.5);

Как я могу перенаправить выше printf вывод кортежей в один файл .csv, например так:

sensorX, sensorY, sensorZ
-0.560303, -0.627686, 0.467468
-0.557312, -0.626587, 0.468262
-0.557800, -0.625854, 0.465820
-0.555420, -0.625061, 0.470520
...
-0.555725, -0.625732, 0.473877

-1

Решение

Вы можете использовать «>» в ​​командной строке при запуске вашей программы.

Пример:

./ program> output.csv

Все, что вы печатаете с помощью функции printf (), будет записано в файл output.csv.

Или вы можете записать все данные в файл, используя функцию fprintf ().

FILE* file = fopen("output.csv", "w");
if (file != NULL)
{
if (sensor_data)
{
mpu.readSensorData(sensor);
float ax = sensor[0] * 250.0 / 368.0;
float ay = sensor[1] * 250.0 / 368.0;
float az = sensor[2] * 250.0 / 368.0;
fprintf(file, "\nsensor: (%f, %f, %f)\n", ax,ay,az);
}
}
5

Другие решения

У вас есть разные варианты сделать то, что вы просите.

Вариант 1 (больше C ++)
использование ofstream

Вариант 2 (С)
Ты можешь использовать fprintf функционировать так же, как printf, давая ему дескриптор файла, созданный с Еореп ().

Вариант 3 (без программирования)
Используйте перенаправление вывода в файл, если вывод вашей консоли уже точно такой, каким вы хотите, чтобы он был в файле CSV:

C: \ yourprogram> output.csv

2

Откройте файл и используйте fprintf, передавая дескриптор файла в него.

FILE *myfile = fopen ("myfilename.csv", "w" );

И тогда внутри вашего цикла:

pc.printf (myfile, "\nsensor: (%f, %f, %f)\n", ax,ay,az);

А потом в конце:

fclose (myfile);

Конечно, это решение в стиле C. Если вы хотите использовать интерфейс типа C ++ (вы пометили его как оба), посмотрите на использование iostreams.

1

Если вы не против закрыть вывод на терминал, вы можете использовать

frepoen("file.csv", "w", stdout);

Это перенаправит ваш printf вывод в файл. Затем вы можете написать свои данные, используя printf.

Вы также можете использовать перенаправления оболочки, такие как ./your_program > file.csv перенаправить стандартный вывод в файлы.

1