我有以下代码:
#include <stdio.h>
#include <string.h>
#define SIZE 6
struct books{
char name[100],author[100];
int year,copies;
};
struct books book1[SIZE],book2[SIZE],*list;
main()
{
unsigned i;
char line [ 100 ],temp1[100],temp2[100],c; /* line size */
size_t len;
FILE *file;
file=fopen("input.txt","rw");
int k=0;
for(i=0; fgets ( line, sizeof line, file) ; i++ ) /* read a line */
{
len = strlen(line);
while (len && line[len-1] == '\n') line[--len] = 0;
switch (i % 4)
{
case 0: /* handle first line here */
fscanf(file, "%[^\n]s",book1[k].author);
break;
case 1: /* handle second line here */
fscanf(file, "%[^\n]s",book1[k].name);
break;
case 2: /* handle third line here */
fscanf(file, "%[^\n]s",temp1);
book1[k].year=atoi(temp1);
break;
case 3: /* handle fourth line here */
fscanf(file, "%[^\n]s",temp2);
book1[k].copies=atoi(temp2);
break;
}
if(i % 4 == 3)
{
k++;
}
}
fclose(file);
i=0;
while(i<SIZE)
{
printf("##########################################################################\n");
printf("\nAuthor: %s\nBook: %s\nYear of Publication: %d\nNo of Copies: %d\n\n",book1[i].author,book1[i].name,book1[i].year,book1[i].copies);
printf("##########################################################################\n");
i++;
}
}
输入文件为:
A
Ruby On Rails
2004
100
J
Learn Python Easy Way
1967
100
D
Harry Potter and the Sorcerer's stone
2012
150
D
Harry Potter and the Sorcerer's stone
3045
140
Z
Harry Potter and the Sorcerer's stone
2013
150
K
Inferno
1993
453
但我的输出是:
##########################################################################
Author: Ruby On Rails
Book: 2004
Year of Publication: 100
No of Copies: 0
##########################################################################
##########################################################################
Author: Learn Python Easy Way
Book: 1967
Year of Publication: 100
No of Copies: 0
##########################################################################
##########################################################################
Author: Harry Potter and the Sorcerer's stone
Book: 2012
Year of Publication: 150
No of Copies: 0
##########################################################################
##########################################################################
Author: Harry Potter and the Sorcerer's stone
Book: 3045
Year of Publication: 140
No of Copies: 0
##########################################################################
##########################################################################
Author: Harry Potter and the Sorcerer's stone
Book: 2013
Year of Publication: 150
No of Copies: 0
##########################################################################
##########################################################################
Author: Inferno
Book: 1993
Year of Publication: 453
No of Copies: 0
##########################################################################
为什么跳过第一行?这段代码有什么问题?
答案 0 :(得分:1)
fgets ( line, sizeof line, file)
此代码跳过第一行。删除它,它会很好。
顺便说一下,fscanf
格式字符串"%[^\n]s"
并不好。将其替换为"%[^\n]\n"
(或更好,"%[^\n]%*c"
- 请参阅@chux的评论)以正确读取行。或者将fscanf
替换为fgets
,以便在没有这些时髦格式字符串的情况下执行相同操作。
答案 1 :(得分:-1)
有类似的问题。虽然它不是一个答案,但它会解决你的问题。
保持输入文件的第一行为空,它将全部正常工作。@ anatolyg提到了这一点。