2010-10-31 4 views
1

gcc 4.4.4 c89Ищет идеи улучшения

Есть ли лучший способ сделать это?

У меня есть следующий код для чтения из текстового файла. Текстовый файл содержит строки, как это:

4 5 6 1 5 7 5 9 5 3 5 7 8 3 2 3 
7 2 3 4 5 3 7 9 3 2 5 6 

Я дал только 2 линии пример, но не может быть больше и с разными длинами.

Что мне нужно сделать, это получить числа в буфер, чтобы я мог их использовать. Это достаточно просто.

Однако я ищу решение, которое не будет перезаписывать буфер для каждой строки. Таким образом, мой результат буфер должен содержать следующее:

4 5 6 1 5 7 5 9 5 3 5 7 8 3 2 3 7 2 3 4 5 3 7 9 3 2 5 6 

Так я использую fgets, чтобы прочитать в строках, и переходя эту линию к моему анализу функции.

Однако мне нужно значение приращения в цикле for, чтобы начать с того, где последний закончен.

Я установил device_buff в положение static. Это безопасно. Я не хочу использовать статическую переменную внутри функции, поскольку они не являются потокобезопасными и составляют глобальную переменную.

int g_load_devices_numbers(void) 
{ 
    fget(line_read, DEVICE_SIZE, fp) == NULL) { 
     analyse_device_numbers(line_read); 
    } 
} 

static void analyse_device_numbers(const char * const device_line) 
{ 
    size_t i = 0; 
    static char device_buff[1024] = {0}; 
    static size_t device_counter = 0; 
    /* Start inserting the last index */ 
    static size_t buff_counter = 0; 

    /* copy each number into the char array 
    * only copy up to the 'return' as fgets always inserts one */ 
    for(i = 0; device_line[i] != '\n'; i++, buff_counter++) { 
     device_buff[buff_counter] = device_line[i]; 
     /* Only count numbers and not spaces */ 
     if(isspace(device_buff[buff_counter]) == 0) { 
      device_counter++; 
     } 
    } 

    /* nul terminate the vote buffer */ 
    device_buff[buff_counter] = '\0'; 

} 

Большое спасибо за любые предложения,

+0

не нужно отменять действие device_buff. Это совершенно бесполезно, поскольку вы уже справляетесь с его длиной. Нулевое завершение - это всего лишь условное обозначение для буферов char *, чтобы иметь возможность передавать их в строковые библиотечные функции (printf, strcpy и т. Д.). – kriss

+0

Пожалуйста, используйте более подробное название для вашего вопроса. –

ответ

1

Нет, используя статический буфер для device_buff не является безопасным здесь. Не из-за самого буфера, а потому, что он имеет ограниченный размер (1024 элемента), который не проверяется.

Было бы безопаснее предоставить в качестве входных параметров анализу_device_numbers буфер, в котором должны храниться данные, и длина этого буфера. Должна быть проверена длина, чтобы избежать записи после последней ячейки предоставленного буфера, и вам нужно выбрать какое-либо соглашение об управлении ошибками (например, вернуть -1 из анализируемого_девиса_numbers, когда произошло переполнение буфера).

Чтобы всегда записывать в том же целевом буфере обычный трюк, если переместить начало предоставленного буфера (чтобы учитывать уже сохраненные элементы) и уменьшить общую длину на один и тот же amout. Это можно сделать во внешнем цикле, который вызывает g_load_device_numbers.

Смежные вопросы