Как я могу проверить расширения файлов в c? - PullRequest
3 голосов
/ 31 января 2011

Я борюсь с этим уже несколько дней.

Я хочу создать функцию, которая проходит через каталог, выбрать все файлы с расширением * .csv и прочитать данные в них.

Я создал функцию, которая должна проверять каждое допустимое имя файла, проверяя, что строка заканчивается на .csv.Для этого я хочу перейти в конец массива char *.Я пробовал это:

 char * point = file_name;
 while (point != "\0"){
    point += 1;
 }

, который проходит через массив char * без поиска и "\ 0".

Если я пишу

*point != "\0"

Компилятор предупреждает менячто я сравниваю и int с char.

Я должен отметить, что я получаю имя файла, используя

 dirent->d_name

Ответы [ 6 ]

9 голосов
/ 31 января 2011

point != "\0" сравнивает указатель с другим указателем, а это не то, что вам нужно.

Вы хотите сравнить все, на что указывает point, символ со значением 0. Поэтому используйте, например,

*point != '\0'; 

Обратите внимание: если вы хотите найти конец строки, вы также можете сделать

point = file_name + strlen(filename); 

Если вы хотите проверить, заканчивается ли строка в .csv, вы также можете сделатьчто-то вроде

if((point = strrchr(filename,'.')) != NULL ) {
     if(strcmp(point,".csv") == 0) {
          //ends with csv
      }
  }

РЕДАКТИРОВАТЬ: исправлено форматирование

7 голосов
/ 31 января 2011

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

while (*point != '\0')
  point++;

Обратите внимание, что правая часть - это символьный литерал (одинарные кавычки), а не строка (двойные кавычки).Это исправляет предупреждение, которое вы получили при попытке использовать строку.

Также обратите внимание, что действительно нет необходимости искать конец строки, чтобы проверить это.Лучшим подходом было бы:

int ends_with(const char* name, const char* extension, size_t length)
{
  const char* ldot = strrchr(name, '.');
  if (ldot != NULL)
  {
    if (length == 0)
      length = strlen(extension);
    return strncmp(ldot + 1, extension, length) == 0;
  }
  return 0;
}

. Вызовите выше, например, с помощьюpts_with ("test.foo", "foo", 3), и вы получите 1 возвращенный результат, если совпадений не найдено, он вернет 0.

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

1 голос
/ 31 января 2011

Размотка верна, вы просто неверно истолковали его код.То, что многие (особенно новички; не хотят вас так называть) не замечают (особенно, когда приходят из других языков, таких как JavaScript или PHP), что «» и «» не совпадают в C ++.(Они также не в PHP, но разница здесь больше.)

"a" - это строка - по сути, const char[2].'a' - это один символ - это просто char.

. Вам нужно сравнить один символ с одним, поэтому вам нужно использовать '\0'.Если вы используете "\0", вы по существу сравниваете свой символ с адресом практически пустой строки (которая является целым числом).

0 голосов
/ 20 августа 2015

Основываясь на ответе @ unwind, я предлагаю эту версию, чтобы проверить, заканчивается ли name конкретным extension.Обратите внимание, что входные данные объявлены как константные указатели, указывающие на const char.

int stringEndsWith(
        char const * const name,
        char const * const extension)
{
    size_t length = 0;
    char* ldot = NULL;
    if (name == NULL) return 0;
    if (extension == NULL) return 0;
    length = strlen(extension);
    if (length == 0) return 0;
    ldot = strrchr(name, extension[0]);
    if (ldot != NULL)
    {
        return (strncmp(ldot, extension, length) == 0);
    }
    return 0;
}
0 голосов
/ 31 января 2011

Чтобы получить расширение из имени файла, вы можете использовать функцию strrchr, чтобы получить позицию последнего вхождения символа в строку:

char * end = strrchr(filename, '.');
if(strcmp(end, ".csv") == 0)
{
    // Yuppee! A CSV file! Let's do something with it!
}

(И посмотрите, что говорили другие, поскольку они решают несколько проблем с вашим кодом.)

0 голосов
/ 31 января 2011

Попробуйте одинарные кавычки, а не двойные.Это ограничивает константу для символа.Двойные кавычки для строк, а не символов.Вам нужно разыменовать точку, используя *, чтобы добраться до персонажа:

 char * point = file_name;
 while (*point != '\0')
    ++point;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...