我正试图创建一个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 ]
。然而,它也会读取名称后面的尾随空格,然后您需要去掉这些空格。