2009-09-23 1 views
4

Мне нужно записать переменное количество символов в файл. Например, скажем, я хочу напечатать 3 символа. «TO» будет печатать «TO» в файл. «LongString of Characters» будет печатать «Lon» в файле.Как установить количество символов, выводимых в формате fprintf '% s', используя переменную?

Как я могу это сделать? (количество символов определяется в другой переменной). Я знаю, что это возможно fprintf (файл «% 10s», строка), но 10 предопределен

ответ

18

Это один соответствует вашему примеру:

fprintf(file, "%*s", 10, string); 

но вы упомянули максимум, а также, чтобы также ограничить число:

fprintf(file, "%*.*s", 10, 10, string); 
+1

+1 для удобства использования. – Ashwin

1

Я считаю, что вам нужно «% * S», и вы должны будете пройти длину как целое перед строкой.

+0

Это напечатает _at наименьшее_, что много символов, и не будет ограничивать количество напечатанных символов. –

1

В качестве альтернативы, почему бы не попробовать это:

void print_limit(char *string, size_t num) 
{ 
    char c = string[num]; 
    string[num] = 0; 
    fputs(string, file); 
    string[num] = c; 
} 

Временно обрезает строку длины вы хотите, и затем восстанавливает его. Конечно, это не обязательно, но это работает, и это довольно легко понять.

+1

Если вы это сделаете ... убедитесь, что длина 'string' не меньше' num-1', или вы будете временно перезаписывать некоторый случайный байт памяти !! – jnylen

+0

Это правда. Пусть это будет урок никогда не доверять торопливо/лениво написанный код, который вы выходите из Интернета. –

0

В качестве альтернативы, вы можете создать «c_str» из вашего буфера и подготовить строку PRINTF, как я, что в этом источнике:

void print(char *val, size_t size) { 
    char *p = (char *)malloc(size+1); // +1 to zero char 
    char current; 
    for (int i=0; i < size; ++i) { 
     current = val[i]; 
     if (current != '\0') { 
      p[i] = current; 
     } else { 
      p[i] = '.'; // keep in mind that \0 was replace by dot 
     } 
     p[i+1] = '\0'; 
    } 
    printf("%s", p); 
    free(p); 
} 

Но это решение не в ту сторону. Вы используете fprintf с форматом «% * s».