что не так со следующим использованием strtok ()? - PullRequest
0 голосов
/ 24 января 2012

Я использую vc2010, и я пытаюсь прочитать содержимое файла в структуру следующим образом, и это дает мне ошибку во время выполнения.

char buf[100];
char *token = NULL; 
while( fgets (buf , 100 , rd) != NULL )
{
    token = strtok( buf,", ");
    test_st.fp.chunk_offset = atol(token); 
    printf("\n %llu ", test_st.fp.chunk_offset); 

    //OPTION 1: if i do this there will be no runtime error but the same
    // value as the first token will be assigned to chunk_length
    token = strtok(buf, ",");
    //OPTION 2: this line gives error in the second while loop iteration
    token=strtok(NULL,",");
    test_st.fp.chunk_length = atol(token);
    printf("%llu ",  test_st.fp.chunk_length);  
    token = strtok(NULL, " ");
    ....
}

Моя другая проблема заключается в том, как я могу использовать strtok () или что угодно, если оно есть, для назначения очень длинной символьной строки (например, после второй запятой в следующем содержимом файла) в элемент данных структуры (в этот случай в fp.fing_print )?

Вот первая часть файла, который я пытаюсь прочитать

0,4096,2ed692b40e335f7c20b71c5ed0486634
4096,3028,da40bf20c8ff189087b8bd7e8580118a
7124,2177,e6dfaee81e96095d302c82f9fd73dc55
9301,1128,76201eadff3c89a381a314ed311f75ff

определение структуры, в которое я пытаюсь это прочитать:

typedef struct fpinfo
{
  unsigned long chunk_offset;
  unsigned long chunk_length;
  unsigned char fing_print[32];
}fpinfo;

typedef struct Hash_Entry {
   struct Hash_Entry *next;  /* Link entries within same bucket. */
   unsigned namehash;        /* hash value of key */
   struct fpinfo fp;
} Hash_Entry;

EDIT:
Да, вы правы, я должен использовать второй вариант.
Я НАШЕЛ ПРОБЛЕМУ С ЭТИМ. Файл имеет пустые строки между каждой строкой и выдает сообщение об ошибке, когда попадает в эти пустые строки.

НО Я УСТРАНЕН в другой проблеме, где я должен прочитать последнюю часть каждой строки в элемент массива ( fp.fing_print ) структуры.

Спасибо всем за помощь !!!

EDIT: Предполагается, что массив fing_print [32] содержит 32 символа, которые являются результатами хэш-функции md5. Я не уверен, должен ли я сделать это нулевой завершенной строкой или нет. если бы вы, ребята, могли бы дать мне совет об этом, я буду более чем благодарен.

Ответы [ 2 ]

1 голос
/ 24 января 2012

Как указано paulsm4, вам нужно проверить strtok() возвращаемое значение.Следующий код работает и включает создание строки:

while( fgets (buf , 100 , rd) != NULL )
{
    token = strtok(buf,", \n");
    if (0 != token)
    {
        test_st.fp.chunk_offset = atol(token); 
        printf("\tchunk_offset=%lu\n", test_st.fp.chunk_offset); 

        token = strtok(0, ", \n");
    }

    if (0 != token)
    {
        test_st.fp.chunk_length = atol(token);
        printf("\tchunk_length=%lu\n", test_st.fp.chunk_length);  
        token = strtok(0, ", \n");
    }

    if (0 != token)
    {
        /* EDIT: fing_print datatype changed. */
        memset(test_st.fp.fing_print, 0, sizeof(test_st.fp.fing_print));
        strncpy(test_st.fp.fing_print,
                token,
                sizeof(test_st.fp.fing_print) - 1);

        /* test_st.fp.fing_print = _strdup(token); */

        printf("\tfing_print=[%s]\n", test_st.fp.fing_print);
    }

    printf("\n");
}

Набор разделителей равен ", \n", так как fgets() будет читать символ новой строки в buf.

1 голос
/ 24 января 2012

Вам необходимо проверить NULL на возврат:

  if ((token = strtok(buf, ",")) {
    // must have found a comma
  }
  if (token && (token = strtok(NULL,"'")) {
    // Two in a row: I found a comma and then I found an apostrophe
  }
  ...
...