我的任务是从txt文件中获取输入并将其读入struct数组的各个部分,然后对其进行操作,但是从文件中读取时遇到了麻烦。
我的结构如下:
typedef struct Employee
{
char first[7], initial, last[9], street[16], city[11], state[2], zip[5];
int age;
char sex;
int tenure;
float salary;
} Employee;
在我的主要范围内:
我将MAX定义为100
FILE *payfile;
Employee worker[MAX];
int i = 0, num;
float average;
payfile = fopen("payfile.txt","r");
while(!feof(payfile))
{
fscanf(payfile,"%s %c %s %s %s %s %s %d %c %d %f",
worker[i].first,&worker[i].initial,worker[i].last,worker[i].street,
worker[i].city,worker[i].state,worker[i].zip,&worker[i].age,&worker[i].sex,
&worker[i].tenure,&worker[i].salary);
i++;
}
这是我们要从中读取的txt文件:
ADA A AGUSTA 33 BABBAGE ROAD LOVELACE GB 19569 28 F 2 350.50
ISSAC A ASIMOV 99 FICTION WAY AMHERST MA 63948 58 M 6 423.88
HUMPHRY R BOGART 71 SAM STREET HOLLYWOOD CA 48482 56 M 5 366.00
ALBERT G EINSTEIN 94 ENERGY WAY PRINCETON NJ 47474 67 M 8 780.00
EMMYLOU L HARRIS 66 COUNTRY ROAD NASHVILLE TN 72647 38 F 2 767.42
JAMES T KIRK 11 SPACE STREET VULCAN CA 82828 46 M 1 235.70
TED L KOPPEL 55 ABC PLACE WASHINGTON DC 37376 48 M 9 909.44
DAVID T LETTERMAN 14 WNBC AVENUE NEW YORK NY 19338 47 M 5 445.65
STEVIE R NICKS 31 MUSIC ROAD CHICAGO IL 23459 38 F 8 460.88
MONTY P PYTHON 76 SILLY STREET LONDON GB 80939 44 M 2 320.50
ROGER R RABBIT 15 LOONEY TOONS HOLLYWOOD CA 91343 24 M 4 259.53
SALLY W RIDE 21 COLUMBIA WAY HOUSTON TX 91123 30 F 9 707.80
ROD Q SERLING 11 TWLIGHT ZONE SAN DIEGO CA 93939 56 M 1 440.00
LUKE R SKYWALKER 43 MILKY WAY NEW YORK NY 12343 35 M 5 660.00
所以我在fscanf精度上遇到了一些麻烦。
要检查包含的工作程序,我正在使用printf(“%s”,worker [0] .first)和printf(“%c”,worker [0] .initial)...等等。
当我扫描第一行中的第一个字符串时,我得到了ADA,然后扫描了空格并得到了下一个字符A。到目前为止,还不错。然后,我扫描空白并获取下一个字符串,该字符串返回AGUSTA。但是现在我遇到了这个问题。我需要使33 BABBAGE ROAD进入worker [0] .street,但是将参数“%s”更改为“%16c”无效。相反,它包括部分城市。
我究竟做错了什么?如何更改以正确的精度扫描相应的代码行?
谢谢。
最佳答案
char first[7], initial, last[9], street[16], city[11], state[2], zip[5];
如果要使用字符串(C字符串)读取,包括EOS在内的char大小是不够的。
改成
typedef struct Employee {
char first[8], initial, last[10], street[17], city[12], state[3], zip[6];
int age;
char sex;
int tenure;
float salary;
} Employee;
用空格分隔的scanf读取中的控制字符
%s
,指定读取大小和未读取字符,例如。 while(EOF!=fscanf(payfile,"%7s %c %9s %16[^\n] %11[^\n] %2s %5s %d %c %d %f",
worker[i].first,&worker[i].initial,worker[i].last,worker[i].street,
worker[i].city,worker[i].state,worker[i].zip,&worker[i].age,&worker[i].sex,
&worker[i].tenure,&worker[i].salary))
{
i++;
}
如果不需要尾随空格,则可以删除。
关于c - 在C中使用fscanf从.txt文件读取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/16511844/