2013-04-30 2 views
1

У меня есть текстовый файл, похожий на следующее:C strtok и зЬгсру

Name1: ID1 
Name2: ID2 
Name3: ID3 

Я пытаюсь разобрать его, чтобы получить

Name1 
Name2 
Name3 

хранится в переменной.

я написал следующую функцию:

/* 
* filename Name of file to read 
* result  The result will be stored here 
*/ 

void readlist(char* filename, char* result) { 
    FILE *fp; 
    char buffer[2048]; 
    memset((void *)result, '\0', BUFFER_SIZE); 

    fp = fopen(filename, "r"); 

    while (fgets(buffer, sizeof(buffer), fp)) { 
     char *token = NULL; 
     token = strtok(buffer, ":"); 
     strcat(result, token); 
    } 

    fclose(fp); 
} 

Однако, когда я называю его:

char result[2048]; 
readlist("test.txt", result); 
printf("%s", result); 

Я получаю пустой вывод. Кажется, что strtok() испортил данные, но я могу ошибаться.

Что я здесь делаю неправильно?

Спасибо заранее!

ответ

1

Я побежал код (или, по крайней мере, я создал одну программу из фрагментов кода), и она работала хорошо для меня:

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

void readlist(char* filename, char* result); 

int main(void) { 
char result[2048]; 
readlist("test.txt", result); 
printf("%s", result); 
} 

void readlist(char* filename, char* result) { 
    FILE *fp; 
    char buffer[2048]; 

    fp = fopen(filename, "r"); 

    while (fgets(buffer, sizeof(buffer), fp)) { 
     char *token = NULL; 
     token = strtok(buffer, ":"); 
     strcat(result, token); 
    } 


    fclose(fp); 
} 

Когда я запустил его на входной файл, я получил как выход

Name1Name2Name3 

Ровно как ожидалось.

Это использовало gcc-компилятор версии 4.2.1 в Mac OS. Это говорит о том, что ваш код не так далеко, как вы думаете (независимо от того, является ли компилятор инициализацией строки до 0, прежде чем запуск зависит от реализации, очевидно). Чтобы быть в безопасности, вам нужно убедиться, что ваш исходный результат - все нули. Вы можете сделать

char result[2048] = {'\0'}; 

Это гарантирует, что все элементы инициализированы нулем.Другой способ заключается в использовании

static char result[2048]; 

Так как любой переменной, объявленной static будет инициализирован в ноль.

Наконец, такие вещи, как

result[0] = '\0'; 

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

+0

Спасибо, что проверили это для меня. Я потратил много часов, пытаясь понять из-за проблемы. Похоже, что что-то не так с моим компилятором ... –

+0

Спасибо за согласие, но я думаю, что вы переходите к выводам о том, что ваш компилятор «ошибается». Я думаю, что поведение «не определено» для таких вещей Следуйте одному из предложений, которые я сделал для обеспечения того, чтобы 'result' был инициализирован чем-то разумным (как также указывалось другими ответами) - не просто вините ваш компилятор! – Floris

+0

Да, я пробовал это, однако это не было (1) {} цикл позже в функции main(), и по какой-то причине он заставлял выход зацикливаться, даже если выходной код до и снаружи цикла. Большое спасибо! –

1

Убедитесь, что вы инициализируете result пустой строке. Либо

char result[2048] = ""; 

в вызывающем или

result[0] = '\0'; 

в верхней части ReadList().

+0

Спасибо, но это не поможет. Если я изменяю цикл while только на strcat (result, buffer); он возвращает содержимое всего файла в порядке. –

2

Вы никогда не инициализировали результат, перед вызовом readlist или после.

просто добавить перед вызовом readlist: strcpy(result, "");

+0

Спасибо за ответ, но это не проблема (я пробовал это). –

+0

Интересно, ваша проблема в том, что вы читали файл с RETURNS и LINEFEEDS, а RETURNS были бесполезны с вашим выходом и заставляли его выглядеть так, как будто ничего не было сопоставлено. Я рекомендую перенаправить вывод в файл (например ./program> save.output) и проверить вывод в редакторе. – dmg

2
char result[2048]; 

Инициализировать это утверждение в противном случае результат будет содержать значения для мусора, как сво auto переменной.

Таким образом, используется char result[2048] = ""; до readlist() в вашей функции main.

+0

Я пробовал это, не разрешил проблему :( –

+0

@max Вы проверили файл правильно и вы можете прочитать файл? –

Смежные вопросы