c-在链表中输入一个特殊的文本文件并尝试打印



我正试图创建一个C程序,从一个名为records.txt的文件中读取可用信息并将其输入到一个链表中,并试图将其打印为一个简单的测试,但我不确定程序哪里出了问题,因为它根本没有输入或打印任何内容。任何建议都会非常有帮助。

records.txt经过:数据代码(int(、州(string(、城镇名称(string

//从records.txt文件到输入的行:

2564273NYKirby                                                 57      0.108676 43.803003-108.180310 6344  3.3662
7483946WYNewville                                            2085      2.435594 30.659203 -93.89685227591  0.9094
6394057HKickersville                                          520      1.963467 39.958220 -82.59599812626  0.2182
9174015ILWorkland Springs                                    1166      1.125451 42.091306 -88.850345 9110  7.4211
2373597NCFunland                                              579      8.390613 34.301093 -77.78746720394  3.5175
9533594WAKirkland                                           45054     10.675565 47.685821-122.191729  386  0.3655
7183994INHappy Mines                                          766      0.323048 40.193940 -86.36009213178  4.7952
0194152IAMoonville                                             76      0.285352 41.728980 -95.26655811596  5.1724

//迄今为止的C程序:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <dlfcn.h>
#include <unistd.h>
// places record
typedef struct records{
char state[2], name[30];
int code, popul, interCode;
float area, latit, longit, interDist;
} records;
// linked list with places record
typedef struct node{
records data;
struct node *next;
} node, *list;
// insert a record into list
void insert_list (list *L, records data) {
node *p;

// get a free node
p = (node *) malloc (sizeof (node));

// put the record in it
p->data = data;

// link it to the first node in the list
p->next = *L;

// make the first node equal to this one
// (so now the former first, p->next, is the second)
*L = p;
}
// create an empty list
void create_list (list *L) {
*L = NULL;
}
// main program
int main () {
list data;    // data list of records.txt
records r, *p = NULL;
FILE * fin;

// open the file if possible otherwise error displayed
fin = fopen ("records.txt", "r");
if (!fin) {
perror ("records.txt");
exit (1);
}

// make an empty list
create_list (&data);

// read records, inserting them into the list
while (1) {
fscanf (fin, "%d %s %s %d %f %f %f %d %f",
&r.code, r.state, r.name, &r.popul,
&r.area, &r.latit, &r.longit, &r.interCode, &r.interDist);

// if reached end of file get out of loop
if (feof (fin)) break;
insert_list (&data, r);

// test print
printf ("%d %s %s %d %f %f %f %d %fn", p->code, p->state, p->name, p->popul,
p->area, p->latit, p->longit, p->interCode, p->interDist);
}
fclose (fin);
exit (0);
}

一个主要问题是,例如%s读取空格分隔的"单词";。如果你有例如NYKirby,那么它将作为一个单词来阅读。

另一个主要问题是%s以null结尾的字节字符串写入数组。您需要为null终止符保留空间。长度为2的字符串需要3个字符的空间。

第一个问题可以通过使用字段宽度说明符来解决,例如%2s,只读取两个字符。

第二个问题可以通过增加阵列的大小来解决。

还有第三个问题,那就是您没有检查fscanf返回了什么。您需要这样做来检查错误。


这给您留下了读取包含空格的字符串的问题,如Workland Springs

解决这个问题的一个潜在方法是使用%[]格式,指定fscanf只能读取字母和空格。也许像%29[A-Za-z ]。然而,它也会读取名称后面的尾随空格,然后您需要去掉这些空格。

相关内容

  • 没有找到相关文章

最新更新