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

Я хочу записать PID в определенный файл. Пока он повторяет pid в терминале. Но как записать этот PID в файл?

int main()
{
pid_t pid = getpid();
printf("%lu\n", pid);

char *filename = "/.wirebot/pid.txt";
char *home_dir = getenv("HOME");
char *filepath = malloc(strlen(home_dir) + strlen(filename) + 1);
strncpy(filepath, home_dir, strlen(home_dir) + 1);
strncat(filepath, filename, strlen(filename) + 1);

FILE *fp;
fp = fopen(filepath, "w");
 if (fp == NULL) {
} else {
    fputs("%lu\n", pid, fp);
    fclose(fp);
    }

}

Слишком много аргументов в fputs - это ошибка, которую я получаю.

Используете fprintf вместо fputs? Разве вы не получали ошибки/предупреждения компилятора? Вы включили stdio.h?

Jabberwocky 10.01.2023 16:01

Функцию freopen можно использовать для перенаправления STDIN в файл.

abelenky 10.01.2023 16:02

@abelenky неясно, что он на самом деле хочет сделать, потому что он уже пытается напечатать pid в файл с помощью fputs("%lu\n", pid, fp);, что, конечно, неправильно.

Jabberwocky 10.01.2023 16:03

Кстати: не имеет отношения к вашей проблеме: не используйте strncpy, вероятно, это не то, что вы думаете. Внимательно прочитайте его документацию. strncpy — это не то же самое, что более безопасная версия strcpy.

Jabberwocky 10.01.2023 16:06

@abelenky freopen тоже была моя первая мысль. Но вопрос был о STDOUT, а не о вводе.

harper 10.01.2023 16:09

@harper: Опечатка с моей стороны: я имел в виду перенаправление stdout, а не stdin. Но ответ остается: freopen — вероятный кандидат на то, что они пытаются сделать.

abelenky 10.01.2023 16:12

Sascha7777, В сторону: Подумайте об упрощении strncpy(filepath, home_dir, strlen(home_dir) + 1); strncat(filepath, filename, strlen(filename) + 1); до sprintf(filepath, "%s%s", home_dir, filename);. Пусть компилятор выдает эффективный код.

chux - Reinstate Monica 10.01.2023 17:14

@chux Спасибо, я сделал это, и пока это работает. Хороший.

Sascha7777 10.01.2023 18:11
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Ускорьте разработку веб-приложений Laravel с помощью этих бесплатных стартовых наборов
Laravel - это мощный PHP-фреймворк, используемый для создания масштабируемых и надежных веб-приложений. Одним из преимуществ Laravel является его...
Что такое двойные вопросительные знаки (??) в JavaScript?
Что такое двойные вопросительные знаки (??) в JavaScript?
Как безопасно обрабатывать неопределенные и нулевые значения в коде с помощью Nullish Coalescing
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание ресурсов API Laravel: Советы по производительности и масштабируемости
Создание API-ресурса Laravel может быть непростой задачей. Она требует глубокого понимания возможностей Laravel и лучших практик, чтобы обеспечить...
Как сделать компонент справочного центра с помощью TailwindCSS
Как сделать компонент справочного центра с помощью TailwindCSS
Справочный центр - это веб-сайт, где клиенты могут найти ответы на свои вопросы и решения своих проблем. Созданный для решения многих распространенных...
Асинхронная передача данных с помощью sendBeacon в JavaScript
Асинхронная передача данных с помощью sendBeacon в JavaScript
В современных веб-приложениях отправка данных из JavaScript на стороне клиента на сервер является распространенной задачей. Одним из популярных...
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Как подобрать выигрышные акции с помощью анализа и визуализации на Python
Отказ от ответственности: Эта статья предназначена только для демонстрации и не должна использоваться в качестве инвестиционного совета.
1
8
64
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

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

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

// C Program for the above approach  
#include<stdio.h>
int main()
{
    int i, n=2;
    char str[50];
   
    //open file sample.txt in write mode
    FILE *fptr = fopen("sample.txt", "w");
    if (fptr == NULL)
    {
        printf("Could not open file");
        return 0;
    }
   
    for (i = 0; i < n; i++)
    {
        puts("Enter a name");
        scanf("%[^\n]%*c", str);
        fprintf(fptr,"%d.%s\n", i, str);
    }
    fclose(fptr);
   
    return 0;
}

Без ширины scanf("%[^\n]%*c", str); существует риск переполнения буфера. Также проблема заключается в том, что пользователь вводит "\n". Рекомендую fgets() и отрубаю '\n'.

chux - Reinstate Monica 10.01.2023 16:52

Это всего лишь пример того, как использовать fprintf(), не нужно иметь пуленепробиваемый код, верно?

brushtakopo 10.01.2023 16:54

Не нужно". Это зависит от качества ответа, который вы хотите. Ваш звонок.

chux - Reinstate Monica 10.01.2023 16:56
Ответ принят как подходящий
Как перенаправить вывод printf в файл?

Используйте freopen(new_filename, "w", stdout)

if (freopen(new_filename, "w", stdout)) {
  fprintf(stderr, "Success\n");
  printf("%lld\n", (long long) pid);
} else {
  fprintf(stderr, "Failed\n"):
}
Но как записать этот PID в файл?

Можно напрямую использовать fprintf().

  // fputs("%lu\n", pid, fp);
  fprintf(fp, "%lld\n", (long long) pid);

См. также Какой правильный спецификатор printf для печати pid_t.

Другие вопросы по теме