Как я могу манипулировать содержимым указателя на символ? - PullRequest
0 голосов
/ 16 марта 2020

Я пишу C программу, которая ожидает имя файла в качестве аргумента. Программа прочтет содержимое файла и выведет другой файл (с аналогичным именем, с таким же расширением, но с добавленными символами в конце имени).

Например, если я запускаю Двоичный файл выглядит так:

./a.out some_file.txt

Затем будет создан новый файл some_file_out.txt.

New File Created: [some_file_out.txt]

Мой код ниже работает, но он слишком уродлив. Я уверен, что есть лучший способ сделать это. Я подумал о работе с std::string, и это упростило бы ситуацию, но я не смогу использовать строковое значение с fopen(), поскольку оно принимает только char* переменные имени файла.

Что лучше способ манипулирования char* переменной?

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

int main(int argc, char* argv[]) {
    // validate argc count and that argv[1] file exists
    // assume all validation is done. For simplicity's sake.

    char* input_file = argv[1];
    /* do something with the file*/

    char output_file[strlen(argv[1]) + 4];  // reserve a new char[] with the same size
                                            //  as the input file, plus 4 characters for
                                            //  the output filename variation

    // assuming the extension is 3 characters long in all cases
    int dot_location = strlen(argv[1])-4;

    // copy characters from input filename to output filename
    for(int i=0; i<dot_location ; i++) {
        output_file[i] = input_file[i];
    }

    // add the name variation:
    output_file[dot_location  ] = '_';
    output_file[dot_location+1] = 'o';
    output_file[dot_location+2] = 'u';
    output_file[dot_location+3] = 't';

    // add the extension back
    for(int i=0; i<4; i++) {

        int new_index = dot_location + i + 4;
        int old_index = dot_location + i;

        output_file[new_index] = input_file[old_index];
    }

    // make sure the last character is a null value (not required)
    // output_file[dot_location+8] = '\0';

    // do something with the output file...
    printf("New File Created: [%s]\n", output_file);

}

1 Ответ

1 голос
/ 16 марта 2020

Вы можете использовать std :: string для этого использования, просто используйте str.c_str().

Но чтобы ответить на ваш вопрос о C кодировании. Я делаю что-то вроде этого:

// find extension position
int ext_pos = strrchr(filename, '.') - filename;
// allocate new string
char newname[strlen(filename) + 4 + 1]; // +1 for null byte

strncpy(newname, filename, ext_pos); // copy first part
strncpy(&newname[ext_pos], "_out", 4); // write _out
strcpy(&newname[ext_pos + 4], &filename[ext_pos]); // copy extension and add null byte
...