как читать строку из файла с разделителями \ n

Я пытаюсь прочитать файл с обратным разделителем. полный фраз.

Я пытаюсь собрать каждую фразу в строку.

Проблема в том, что когда я пытаюсь прочитать файл с

fscanf(file,"%50s\n",string);

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


person maty_nz    schedule 27.04.2010    source источник


Ответы (5)


fscanf можно изменить для чтения прошедших пробелов. Детали немного сложны. Вот что говорится на странице руководства о% [...]

Соответствует непустой последовательности символов из указанного набора допустимых символов; следующий указатель должен быть указателем на char, и должно быть достаточно места для всех символов в строке плюс завершающий символ NUL. Обычный пропуск начального белого пространства подавляется. Строка должна состоять из символов в (или не в) определенном наборе; набор определяется символами между символом открытой скобки [символ и закрывающая скобка]. Набор исключает эти символы, если первый символ после открытой скобки - это циркумфлекс ^. Чтобы включить в набор закрывающую скобку, сделайте ее первым символом после открытой скобки или циркумфлекса; любая другая позиция завершит сет. Знак дефиса - тоже особенный; при размещении между двумя другими персонажами он добавляет в набор все промежуточные символы. Чтобы включить дефис, сделайте его последним символом перед последней закрывающей скобкой. Например, «[^] 0-9-]» означает набор «все, кроме закрытых скобок, от нуля до девяти и дефиса». Строка заканчивается появлением символа, не входящего в набор (или с циркумфлексом в), или когда ширина поля заканчивается.

Итак,% [^ \ n] должен читать все, вплоть до возврата каретки.

person Nathan S.    schedule 27.04.2010
comment
Он читает все до новой строки, но не самой новой строки. Если вы зацикливаетесь на fscanf(file, "%[^\n]"), вы просто будете получать пустую строку снова и снова. Вам нужно использовать новую строку либо с пробелом в строке формата, либо с чем-то вроде %*c. - person Adam Rosenfield; 27.04.2010
comment
@Adam Хорошие моменты. Принятый выше ответ также более безопасен для ошибок переполнения буфера. - person Nathan S.; 27.04.2010

fscanf(file,"%50[^\n]\n",string);
  1. Все символы, кроме \n, будут поглощены [^\n]

  2. Будет использовано максимум 0f 50 символов (убедитесь, что в строке есть место как минимум для 51)

  3. .. \n ",string это гарантирует, что \n также потребляется, чтобы следующий вызов не просто возвращал пустую строку.

person N 1.1    schedule 27.04.2010

fscanf с %s прекращает чтение, когда находит пробелы.

Поскольку вы читаете неформатированный текст, вы можете просто использовать fgets, который читает, пока не заполнит предоставленный вами буфер, найдет новую строку (\n) или достигнет конца файла, в зависимости от того, что наступит раньше.

person James McNellis    schedule 27.04.2010
comment
Это странно работает. он не читает каждую строку. и каждая строка вместо того, чтобы заканчиваться на \ 0, оканчивается на \ n - person maty_nz; 27.04.2010
comment
Каждая строка по-прежнему заканчивается на '\0', но последний символ перед этим обычно '\n', так как он читается в строке точно так, как отображается в файле. Если '\n' отсутствует, это означает, что либо ваш буфер недостаточно велик для всей строки, либо вы просто прочитали последние символы в файле, и они не закончились новой строкой. - person caf; 27.04.2010

Избегайте использования scanf. Как уже упоминалось, вместо этого следует использовать fgets.

Если вы не хотите использовать буфер фиксированного размера и разрешать строки произвольной длины, вы можете попробовать использовать ggets функция Чака Фалконера, являющаяся общественным достоянием. (Кажется, эта ссылка сейчас недоступна, но у archive.org есть копия.)

person jamesdlin    schedule 27.04.2010

изначально отправлять данные с использованием Payload_ID 00 01 02 03 .... 10

использовать

char * pChar = ""; // для захвата строки.

fprintf (fp1, "% s", strtok (pChar, "Payload_ID"));

person ashoka vanjare    schedule 04.05.2017
comment
здесь Payload_ID - это разделитель, который вы можете указать - person ashoka vanjare; 04.05.2017