Переименуйте файл и сохраните его как другой - PullRequest
1 голос
/ 13 июля 2020

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

Вот пример. -> example.txt (что я получаю)
Вот то, что я хочу. -> example_blabla.txt (то, что я хочу создать)

Я пытался использовать sprintf(filename, "%s%s", argv[1], "_blabla.txt"), но имя созданного файла example.txt_blabla.txt.

Как я могу удалить расширение первого имени файла из созданного мной файла?

Вот мой код:

    FILE *fp;
    FILE *fp2;
    char filename[300];
    
    if (argc != 2 || argv[1] == NULL) {
        printf(" You did not enter a file name! \n");
        exit(-1);
    }
    
    sprintf(filename, "%s%s", argv[1], "_blabla.txt");
    
    fp = fopen(argv[1], "r");
    fp2 = fopen(filename, "w");
    
    return 0;

Ответы [ 3 ]

0 голосов
/ 13 июля 2020

Вот несколько предложений:

  • , чтобы найти последний '.' в строке, вы можете использовать функцию strrchr() из <string.h>.

  • , чтобы избежать неопределенного поведения для длинных строк, используйте snprintf вместо sprintf.

  • , чтобы скопировать часть строки с snprintf, используйте %.*s с аргументом int перед указателем строки.

Вот модифицированная версия:

#include <stdio.h>
#include <string.h>

int main(int argc, char *argv[]) {
    FILE *fp;
    FILE *fp2;
    char filename[300];
    char *p;
    int pos;
    
    if (argc != 2) {
        printf(" You did not enter a file name!\n");
        return -1;
    }
    
    p = strrchr(argv[1], '.');
    if (p != NULL)
        pos = p - argv[1];
    else
        pos = strlen(argv[1]);

    // Using the %.*s precision field to limit the number of characters
    //  copied from `argv[1]`
    snprintf(filename, sizeof filename, "%.*s_blabla.txt", pos, argv[1]);
    
    fp = fopen(argv[1], "r");
    if (fp == NULL)
        return 1;
    fp2 = fopen(filename, "w");
    if (fp2 == NULL)
        return 1;

    /* copy the file */

    fclose(fp);
    fclose(fp2);
    
    return 0;
}
0 голосов
/ 14 июля 2020

следующий предлагаемый код:

  1. демонстрирует метод извлечения имени root из имени файла с последующим добавлением набора символов.
  2. демонстрирует, как сообщить пользователю, когда параметр командной строки отсутствует.
  3. не выполняет stat(), чтобы убедиться, что исходный файл действительно существует, это остается для OP для включения.
  4. правильно проверяет ошибки ввода-вывода
  5. документы, почему включен каждый файл заголовка
  6. предлагается получить длину параметра argv[1], добавить длину blabla.txt, добавить 1, затем использовать функцию VLA C для соответствующего размера массива filename[]. Примечание: strlen() хорошо подходит для получения длины массива символов с завершением NUL

А теперь предлагаемый код:

#include <stdio.h>    // fopen(), fclose(), perror(), fprintf(), FILE
#include <stdlib.h>   // exit(), EXIT_FAILURE
#include <string.h>   // strrchr(), strcat()

int main( int argc, char (argv[] )
{
    FILE *fp;
    FILE *fp2;
    char filename[300];
    
    if (argc != 2 ) 
    {
        fprintf( stderr, "USAGE: %s fileName\n", argv[0] );
        exit( EXIT_FAILURE );
    }
    
    strcpy(filename, argv[1] );
    char *ptr = strrchr( filename, '.' );

    if( ptr )
    {
        *ptr = '\0';
    }

    strcat( filename,  "_blabla.txt");
    
    fp = fopen(argv[1], "r");
    if( ! fp )
    {
        perror( "fopen for input file failed" );
        exit( EXIT_FAILURE );
    }
  
    fp2 = fopen(filename, "w");
    if( ! fp2 )
    {
        perror( "fopen for output file failed" );
        fclose( fp1 );
        exit( EXIT_FAILURE );
    }
    return 0;
}
0 голосов
/ 13 июля 2020

Добавьте следующие утверждения до и после вашего sprintf() звонка следующим образом:

int i;
char *pChar = NULL;
for (i = strlen(argv[1]) - 1; i >= 0: i--) {
    if (argv[1][i] == '.') {
       pChar = &argv[1][i];
       *pChar = '\0';
       break;
    }
}
sprintf(filename,"%s%s",argv[1],"_blabla.txt");
if (pChar != NULL)
   *pChar = '.';
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...