Сканирование файла и выделение правильного места для хранения файла - PullRequest
1 голос
/ 13 апреля 2011

В настоящее время я использую fscanf для получения слов, разделенных пробелом.Я устанавливаю char [] с фиксированным размером для хранения каждого из извлеченных слов.Как бы я создал символ [] с правильным количеством пробелов для правильного количества символов в слове?Спасибо.

Редактировать: Если я сделаю strdup на char [1000], а char [1000] на самом деле содержит только 3 символа, будет ли strdup зарезервировать место в куче на 1000 или 4 (для завершающего char)

Ответы [ 3 ]

1 голос
/ 13 апреля 2011

Вот решение, включающее только два выделения и не realloc:

  1. Определите размер файла, выполнив поиск до конца и используя ftell.
  2. Allocateблок памяти такого размера и считайте весь файл в него, используя fread.
  3. Подсчитайте количество слов в этом блоке.
  4. Выделите массив char *, способный содержать указателина это много слов.
  5. Повторно переберите блок текста, присваивая каждому указателю адрес начала слова и заменяя разделитель слова в конце слова на 0 (нулевой символ).

Также немного философский вопрос: если вы думаете, что этот подход вставки ограничителей строки на месте и разбивания одной гигантской строки, чтобы использовать ее как можно больше маленьких строк, уродлив, хакер и т. Д.вам, вероятно, следует забыть о программировании на C и использовать Python или какой-либо другой язык более высокого уровня.Способность выполнять радикально более эффективные операции манипулирования данными, подобные этой, минимизируя потенциальные точки отказа, является практически единственной причиной, по которой любой должен использовать C для такого рода вычислений.Если вы хотите пойти и распределить каждое слово по отдельности, вы просто делаете жизнь настоящим адом для себя, делая это в C;другие языки будут счастливо скрывать эту неэффективность (и обилие возможных точек отказа) за дружественными строковыми операторами.

0 голосов
/ 13 апреля 2011

Нет единственного пути. Идея состоит в том, чтобы просто выделить строку, достаточно большую, чтобы вместить максимально возможную строку. После того, как вы прочитали его, вы можете выделить буфер нужного размера и скопировать его при необходимости.

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

Но если вы выделили буфер, скажем, 250 символов, трудно представить себе одно слово, не помещающееся в этот буфер.

0 голосов
/ 13 апреля 2011
char *ptr;    
ptr = (char*) malloc(size_of_string + 1);

char first = ptr[0];
/* etc. */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...