una txt tipos que programa palabras lista leer lea guardar datos crear como cargar archivos archivo c input linked-list text-files scanf

txt - Escaneo en un archivo de texto en una lista vinculada



programa en c que lea un archivo txt (3)

El problema principal es sin duda temp = temp->next sets temp to field next que nunca se inicializó, haciendo que el código se seg. falla en el siguiente ciclo.

Hay problemas relacionados con la lista vinculada y de entrada. Recomendamos no asignar espacio hasta que se encuentren buenos datos.

Comience con un temp_head . El código solo usa el next campo de temp_head .

struct node temp_head; temp_head.next = NULL; struct node *p = &temp_head;

Siempre que el código lea datos de línea, recomendamos usar fgets() para leer la línea y luego escanear el buffer.

char buf[100]; while (fgets(buf, sizeof buf, ifp) != NULL) { struct node nbuf;

Escanee el buffer usando sscanf() . Use ''%[^,]'' para leer hasta '','' .

if (2 != sscanf(buf, " %19[^,],%d", nbuf.name, &nbuf.id)) { break; // Invalid data encountered } nbuf.next = NULL; // Code does not allocate data until good data was found p->next = malloc(sizeof *(p->next)); if (p->next == NULL) break; // OOM p = p->next; *p = nbuf; // Copy the data } head = temp_head.next;

Notas:

El molde en temp = (struct node *)malloc(sizeof(struct node)); no es necesario.

Considere este estilo de asignación: temp = malloc(sizeof *temp) , IMO es más fácil de codificar y menos de mantener.

fscanf(ifp, "%s", &temp->name); fscanf(ifp, "%d", &temp->id); tiene 3 problemas: no hay limitación en la entrada de cadena, no se necesita y no se pueden verificar los resultados del escaneo. El código de aviso anterior usa (2 != sscanf(buf, " %19[^,], %d", nbuf.name, &nbuf.id) , lo que limita la entrada de cadena a 19 caracteres (dejando espacio para la terminación ''/0'' , no usa un & cuando el campo es una matriz, y verifica que los 2 campos fueron escaneados con éxito.

Antes del final de main() , el código debe liberar los datos asignados.

Solo estoy aprendiendo sobre listas enlazadas y tengo que hacer una tarea que tiene muchas partes, pero estoy empezando y lo primero que tengo que hacer es leer en un archivo de entrada en una lista vinculada. Parte del archivo es:

George Washington, 2345678 John Adams, 3456789 Thomas Jefferson, 4567890 James Madison, 0987654 James Monroe, 9876543 John Quincy Adams, 8765432

y contiene un total de 26 líneas.

Todo lo que quiero hacer ahora es simplemente leer en el archivo. Lo intento usando este código (en principio por ahora)

#include <stdio.h> #include <stdlib.h> struct node{ char name[20]; int id; struct node *next; }*head; int main(void){ struct node *temp; temp = (struct node *)malloc(sizeof(struct node)); head = temp; FILE *ifp; ifp = fopen("AssignmentOneInput.txt", "r"); int c = 0; while(c<26){ fscanf(ifp, "%s", &temp->name); fscanf(ifp, "%d", &temp->id); printf("%d/n", c); temp = temp->next; c++; }

Para el resultado, sé que el primer nombre y el primer ID se escanean, porque el valor de c se muestra como 0 (en este momento estoy usando arbitrariamente el valor de c para controlar el fscanf). Pero después de eso, el programa falla. Entonces, el problema debe ser con temp = temp->next; Compila bien.

Soy muy nuevo en las listas vinculadas, así que realmente no sé lo que estoy haciendo.

¡Tu ayuda es apreciada!


En las siguientes líneas, ha asignado suficiente espacio para un solo elemento de la lista (un struct node ) y ha apuntado su puntero a él:

temp = (struct node *)malloc(sizeof(struct node)); head = temp;

Más tarde, lees los valores en los campos de name e id de este elemento:

fscanf(ifp, "%s", &temp->name); fscanf(ifp, "%d", &temp->id);

¿Pero a qué se refiere temp->next punto? Hasta ahora solo has asignado espacio para un solo elemento. Debe asignar espacio para cada elemento posterior a medida que lo agrega a la lista.

Editar: As @ merlin2011 se indica a continuación, esta respuesta simplemente lo ayudará a resolver el bloqueo del programa, pero no hará que su programa funcione completamente como podría esperar. Sin embargo, es de esperar que puedas depurarlo mejor una vez que no se cuelgue.


En primer lugar, ya que estás escribiendo en C , no es necesario lanzar el malloc .

En segundo lugar, debe asignar memoria para cada nuevo nodo usted mismo.

En tercer lugar, el nombre de una matriz ya se descompone en un puntero, por lo que no debe tomar & de eso, porque entonces obtendrá un puntero a un puntero que no es lo que quiere.

Finalmente, debe corregir su sintaxis de scanf para manejar espacios en sus campos.

#include <stdio.h> #include <stdlib.h> #include <string.h> struct node{ char name[20]; int id; struct node *next; }*head; int main(void){ struct node *temp; temp = malloc(sizeof(struct node)); temp->next = NULL; head = temp; FILE *ifp; ifp = fopen("AssignmentOneInput.txt", "r"); int c = 0; char buffer[1024]; memset(buffer, 0, 1024); while(c<5){ fgets(buffer, 1024, ifp); sscanf(buffer, "%19[^,], %d", temp->name, &temp->id); printf("%d %s %d/n",c, temp->name, temp->id); temp->next = malloc(sizeof(struct node)); temp = temp->next; temp->next = NULL; c++; } }