c Как указать путь из аргумента командной строки в fprintf

#c #file #path #format #printf

#c #файл #путь #формат #printf

Вопрос:

У меня возникли проблемы с выяснением, как взять путь из аргумента командной строки и записать мою программу в эту папку с помощью fprinf. Например: /here запишет файл в папку «here», где /here — это путь от того места, где находится программа, до того места, где ее нужно записать. То же самое, если бы путь был / там / здесь. Это только этот раздел моего кода:

     void write_file(int sockfd, char* path)
    {
       int n;
       FILE *fp;
       char filename[] = "file1.txt";
       char buffer[SIZE];

       fp = fopen(filename, "w");
       if (fp == NULL)
       {
          std::cerr << "ERROR: Could not write file.n";
          exit(EXIT_FAILURE);
       }
       while (1)
       {
          n = recv(sockfd, buffer, SIZE, 0);
          if (n <= 0)
          {
             break;
             return;
          }
          fprintf(fp, "%s", buffer);
          bzero(buffer, SIZE);
       }
       fclose(fp);
       return;
    }
 

Этот код работает, но сохраняет файл в моей текущей папке. Переменная «path» является аргументом командной строки.

Редактировать: Это код, который не печатает строки в файл. Вместо этого он копирует строки из существующего файла и помещает эти строки в «file1.txt «досье.

Комментарии:

1. Вы знаете о snprintf ? Вы можете использовать его для построения строк, содержащих несколько значений, таких как две другие строки, отформатированные как %s/%s .

2. Кроме того, fprintf(fp, "%s", buffer); это довольно опасно… Вы уверены , что содержимое в buffer будет строкой с нулевым завершением ?

3. @Someprogrammerdude как мне использовать snprintf, поскольку он не принимает открытый файл в качестве аргумента

4. Кто-нибудь понимает вопрос? Я не думаю, что проблема заключается в использовании frprintf , но в понимании разницы в пути / каталоге: исполняемый файл, местоположение запуска и влияние абсолютных относительных путей.

5. И, скорее всего, проблема заключается в отсутствии завершающего нуля.

Ответ №1:

Вот пример использования std::filesystem (C 17):

 void write_file(int sockfd, const char* path)
{
    auto filename = std::filesystem::path(path) / "file1.txt";
    std::ofstream out{ filename, ios::trunc | ios::out };
    if (!out) {
        std::cerr << "ERROR: " << std::strerror(errno) << "n";
        exit(EXIT_FAILURE);
    }
    char buffer[SIZE];
    while (1)
    {
        int n = recv(sockfd, buffer, sizeof(buffer), 0);
        if (n == 0)
        {
            break;
        }
        if (n < 0) {
            std::cerr << "ERROR: " << std::strerror(errno) << "n";
            break;
        }
        if (!out.write(buffer, n)) {
            std::cerr << "ERROR: " << std::strerror(errno) << "n";
            break;
        }
    }
}
 

Если у вас нет std::filesystem поддержки, вы можете заменить первые 2 оператора некоторой ручной конкатенацией путей, например:

     std::string filename = path;
    if (filename != "" amp;amp; filename.back() != '/')
        filename  = '/';
    filename  = "file1.txt";
 

Комментарии:

1. Я заставил его работать, используя версию, отличную от std::filesystem. Большое вам спасибо!

2. Оказывается, мой FILE * fp передавал файл идеально на наш взгляд, но менял ситуацию за сценой. Итак, мне пришлось изменить его на использование ofstream, и ваш код действительно помог мне понять, как его использовать и использовать для того, что мне нужно. Большое вам спасибо!