Как обработать символ новой строки '\ n' в любом текстовом файле с символами новой строки linux \ r \ n? - PullRequest
1 голос
/ 14 июля 2011

У меня есть код C, который читает по 1 строке за раз, из файла, открытого в текстовом режиме с использованием

fgets(buf,200,fin); 

Входной файл, из которого fgets () читает строки, является аргументом командной строки дляпрограмма.

Теперь fgets оставляет символ новой строки, включенный в строку, скопированный в buf. * ​​1006 *

Где-то в строке кода я проверяю

length = strlen(buf);

Для некоторого вводафайлы, которые, я думаю, редактируются в среде * nix, символ новой строки - это просто '\n'

Но для некоторых других входных файлов тестового примера (которые, я думаю, редактируются / создаются в среде Windows) есть 2 символа, указывающие на новую строку- '\r''\n'

Я хочу удалить символ новой строки и хочу поставить '\ 0' в качестве символа конца строки.Поэтому я должен сделать -

    if(len == (N+1))
    {
    if(buf[length-1] == '\n')
     {
         buf[length-2] = '\0'; //for a `\r\n` newline
     }
    } 

или

if(len == (N))
{
 if(buf[length-1] == '\n')
 {
     buf[length-1] = '\0'; //for a `\n` newline
 }
} 

Поскольку текстовые файлы передаются программе в качестве аргумента командной строки, я не имею никакого контроля над тем, как она редактируется / составляется иследовательно, не может отфильтровать его с помощью какого-либо инструмента, чтобы сделать строки новыми.

Как мне справиться с этой ситуацией?

Есть ли в стандартной библиотеке C какая-либо эквивалентная функция fgets (без расширений), которая может обрабатывать эти противоречивыесимволы новой строки и вернуть строку без них?

Ответы [ 3 ]

2 голосов
/ 14 июля 2011

Мне нравится обновлять length одновременно

if (buf[length - 1] == '\n') buf[--length] = 0;
if (buf[length - 1] == '\r') buf[--length] = 0;

или, чтобы удалить все конечные пробелы

/* remember to #include <ctype.h> */
while ((length > 0) && isspace((unsigned char)buf[length - 1])) {
    buf[--length] = 0;
}
1 голос
/ 14 июля 2011

Я думаю, что ваш лучший (и самый простой) вариант - написать свою собственную функцию strlen:

size_t zstrlen(char *line)
{
  char *s = line;

  while (*s && *s != '\r' && s != '\n) s++;
  *s = '\0';
  return (s - line);
}

Теперь, чтобы вычислить длину строки, исключая символы новой строки и удаляя ее (/ их), вы просто делаете:

fgets(buf,200,fin);
length = zstrlen(buf);

Работает для стиля Unix ('\ n'), стиля Windows ('\ r \ n') и старого стиля Mac ('\ r').

Обратите внимание, что есть более быстрая (но не переносимая) реализация strlen, которую вы можете адаптировать к вашим потребностям.

Надеюсь, это поможет, RD:

0 голосов
/ 14 июля 2011

Если вас беспокоят разные окончания строк (\n и \r\n) на разных машинах, одним из способов их нейтрализации будет использование команды dos2unix (при условии, что вы работаете в linux и редактируете файлы).в среде Windows).Эта команда заменит все окончания строки в стиле окна на окончания строки в стиле linux.Обратное unix2dos также существует.Вы можете вызвать эти утилиты из C-программы (возможно, system), а затем обработать строку, как в настоящее время.Это уменьшит нагрузку на вашу программу.

...