Я работаю над проектом, где мне нужно прочитать файл .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);
}
Когда вы печатаете f() данные по мере их получения, хорошо ли они выглядят или ломаются? Вы заявили, что печатаете его очень поздно в своем коде, и это неверно в этот момент. Я предполагаю, что вы проверили входной файл, и данные там верны ... поэтому теперь ваша задача - выяснить, в чем состоит недостаток кода ... но желательно, попробовав немного больше, прежде чем обращаться за помощью. Если вы сдаетесь слишком рано (и это определенно звучит так, как будто еще слишком рано), вы не сможете многое сделать в «поиске» решения. – mah
«Мах», да, я знаю, я смотрю на него, но я хорошо знаком с C, поэтому я действительно не знаю, как искать ошибку. Данные в файле .txt верны, и ввод этой случайной строки для компонента выглядит корректно. Просто он печатает один, а не все. Я буду больше смотреть на него. Спасибо за хедз-ап! – user2408977
Я предполагаю, что существует проблема с циклом for с fscanf и использованием моей функции add_comp .... – user2408977