2013-05-24 7 views
0

Я работаю над проектом, где мне нужно прочитать файл .txt, где у меня есть данные из четырех элементов для каждого компонента, например: 5 2 7 0.99 (которые являются компоненты id, внутренний узел, внешний узел и надежность) 7 3 5 0.95 ... Я хочу читать и записывать данные в связанный список, по которому позже я смогу найти значения и подписать их на новый связанный список. Речь идет о методе минимальных путей в машиностроении, используемых для расчета надежности систем.Чтение текстового файла с данными в связанном списке

Чтобы проверить код, я просто хочу распечатать все компоненты, которые были помещены в связанный список. Я получаю правильное значение для количества строк, но для компонентов я просто получаю один случайный не все из них. Любой вид помощи будет оценен :)

Вот код:

#include <stdlib.h> 
#include <stdio.h> 

struct Components_element { 
      int id; 
      int in_node; 
      int out_node; 
      float reliability; 
      struct Components_element *next_c; 
}; 

struct Components_element *head_c = NULL; 

int count_lines(char *filename) 
{ 
int counter = 0; 
char c; 
FILE *ptr_sistem; 
ptr_sistem = fopen(filename, "r"); 

if(ptr_sistem == NULL) 
    return 0; 

while((c = fgetc(ptr_sistem)) != EOF) 
if(c == '\n') 
counter++; 

fclose(ptr_sistem); 

if(c != '\n') 
counter++; 

return counter; 
} 

struct Components_element *add_comp(struct Components_element *head_c, int id, int in_node, int out_node, float reliability) 
{ 
struct Components_element *new;  
struct Components_element *tail_c; 

new = (struct Components_element*) malloc(sizeof(struct Components_element)); 
new->id = id; 
new->in_node = in_node; 
new->out_node = out_node; 
new->reliability = reliability; 

if(head_c == NULL) 
    return(new); 
tail_c = head_c;  
while(tail_c->next_c != NULL) 
    tail_c = tail_c->next_c; 
tail_c->next_c = new; 

return(head_c); 
} 

void write_out(struct Components_element *p) 
{ 
while(p != NULL) { 
    printf("%d %d %d %f", p->id, p->in_node, p->out_node, p->reliability); 
    p = p->next_c; 
} 
printf("\n"); 
} 

struct Components_element *empty(struct Components_element *p) 
{ 
struct Components_element *tail_c; 

while(p != NULL) { 
    tail_c = p; 
    p = p->next_c; 
    free(tail_c); 
} 
return(p); 
} 

main() 
{ 
int i, id, in_node, out_node; 
int n_lines; 
float reliability; 
struct Components_element *components; 

FILE *ptr_file; 
ptr_file = fopen("system.txt", "r"); 
if(ptr_file == NULL) { 
    printf("Cannot open file.\n"); 
    return 0; 
} else { 

n_lines = count_lines("system.txt"); 
for(i = 0; i < n_lines; i++) { 
    fscanf(ptr_file, "%d %d %d %f", &id, &in_node, &out_node, &reliability); 
    components = add_comp(head_c, id, in_node, out_node, reliability); 
    ++i; 
    } 
} 
printf("Number of lines: %d.\n", n_lines); 
write_out(components); 
empty(components); 
fclose(ptr_file); 
} 
+0

Когда вы печатаете f() данные по мере их получения, хорошо ли они выглядят или ломаются? Вы заявили, что печатаете его очень поздно в своем коде, и это неверно в этот момент. Я предполагаю, что вы проверили входной файл, и данные там верны ... поэтому теперь ваша задача - выяснить, в чем состоит недостаток кода ... но желательно, попробовав немного больше, прежде чем обращаться за помощью. Если вы сдаетесь слишком рано (и это определенно звучит так, как будто еще слишком рано), вы не сможете многое сделать в «поиске» решения. – mah

+0

«Мах», да, я знаю, я смотрю на него, но я хорошо знаком с C, поэтому я действительно не знаю, как искать ошибку. Данные в файле .txt верны, и ввод этой случайной строки для компонента выглядит корректно. Просто он печатает один, а не все. Я буду больше смотреть на него. Спасибо за хедз-ап! – user2408977

+0

Я предполагаю, что существует проблема с циклом for с fscanf и использованием моей функции add_comp .... – user2408977

ответ

1

Написание кода это лишь малая часть того, что программирование о. Очень тяжелая часть - заставить его работать по мере необходимости.

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

Наиболее полезным инструментом является отладчик. Узнайте, как его использовать, и вы можете найти свою проблему через пару минут.

Иногда, однако, отладчики не всегда доступны, и здесь ситуация может быть довольно сложной и требует регистрации информации (printf/fwrite/etc) и много дедуктивных рассуждений.

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

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