проблема с пустыми строками при чтении из файла в c - PullRequest
0 голосов
/ 13 августа 2010

привет, я прогреммирую в c в среде linux и при чтении из файла сталкиваюсь с трудностями с пустыми строками.я использую функцию strtok для разделения строки с разделителем "," и получаю ошибку сегментации всякий раз, когда файл, из которого я читаю, содержит пустые строки, заранее спасибо

Ответы [ 4 ]

1 голос
/ 13 августа 2010

Вы, похоже, получаете сообщение об ошибке, потому что передаете неверный параметр в strtok - попробуйте проверить, что строка не пуста, прежде чем передавать ее в strtok.

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

0 голосов
/ 14 августа 2010

Мое предложение состоит в том, чтобы написать функцию удаления строки, которая удаляет любые пробелы в начале и конце строки.Выполните каждую строку через эту функцию перед обработкой.Теперь любые пустые строки должны заканчиваться одним символом '\0'.

Функции разрыва строки легко написать, все, что вам нужно, это пара указателей и isspace() из ctype.h.

0 голосов
/ 14 августа 2010

Вот небольшая программа, которая использует strtok() для анализа строк с разделенными запятыми значениями.Это может помочь вам увидеть, что происходит (например, проблема с пустыми полями, которые поднял Жиль).Это также поможет вам увидеть, что происходит с пустыми строками.

Скомпилируйте его и отправьте ему пример данных либо с клавиатуры, либо перенаправив в него файл данных:

#include <stdio.h>
#include <string.h>

char* myGetLine( char* buf, size_t bufSize, FILE* strm)
{
    char* result = fgets( buf, bufSize, strm);

    int len = result ? strlen(result) : 0;

    if (len && result[len - 1] == '\n') {
        // get rid of the pesky newline
        result[len - 1] = '\0';
    }

    return result;
}

int main(void)
{
    char line[80];

    while (myGetLine( line, sizeof(line), stdin)) {
        int i = 0;
        char* token = NULL;

        printf( "%s\n", line);

        token = strtok( line, ",");
        while (token != NULL) {
            printf( "token %d: \"%s\"\n", i, token);
            ++i;
            token = strtok( NULL, ",");
        }

        printf( "%s\n", "enter a new line (or EOF)");
    }

    return 0;
}
0 голосов
/ 14 августа 2010

Я думаю, регулярное выражение слишком велико для этой маленькой домашней работы;у вас есть только 2 части:

  • File / String I / O: например, возьмите "size_t getline (char * s, size_t lim)" отсюда: текст ссылки
  • обработка данных: ',' разделенные столбцы, например, здесь текст ссылки

и теперь его короткий и простой, или?

char line[100];
FILE *f=fopen(...,"rt");
if(!f) ...
while( fgets(line,sizeof line,f) )
  if( getline(line,sizeof line) ) 
  { /* no empty lines here */
    char *p,*t;
    for(puts("new line"),t=mystrtok(&p,line,',');t;t=mystrtok(&p,0,','))
      puts(*t?t:"empty column"); /* also empty columns here */
  }
fclose(f);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...