奇怪的问题,当试图从文档而不是空格扫描数据时,程序在c中读取新行



我试图编写一个代码,从1 .txt文件读取数据,进行某种数据操作,并在新的。txt文件中写入新数据。在这样做的同时,我试图测试数据是否正确地被读取和写入,所以我试图用基本的。txt文件来做,但是每当我运行程序时,如果最后一个字符串由2个单词组成,它会中断并进入一个新的行。


typedef struct sport {
char ime_sporta[MAXSIZE];
int godina;
char osvojena_medalja[MAXSIZE];
char drzava[MAXSIZE];
} Sport;
typedef struct node {
Sport sport;
struct node* next;
}Node;

Node* Ucitavanje() {
FILE* sport_medals = fopen("sport_medals.txt", "r");
if (!sport_medals) {

printf("DAT_GRESKA");
exit(0);
}
Node* head = NULL, * tail = head, * tmp;
Sport s;

while (fscanf(sport_medals," %[^|]| %d %s %sn", s.ime_sporta, &s.godina, s.osvojena_medalja, s.drzava) == 4) {
tmp = malloc(sizeof(*tmp));
if(tmp == NULL){
printf("MEM_GRESKA");
exit(0);
}

tmp->sport = s;
tmp->next = NULL;
if (!head) head = tmp;
else tail->next = tmp;
tail = tmp;
}


fclose(sport_medals);
return head;

}
int ispis(Node* head) {
Node* t;

FILE* f = fopen("winners.txt", "w");
if (!f) {
printf("G3");
exit(0);
}
while (head) {
fprintf(f, "%s|%d %s %sn", head->sport.ime_sporta, head->sport.godina, head->sport.osvojena_medalja, head->sport.drzava);
t = head;
head = head->next;
free(t);
}
fclose(f);
}
int main() {
Node* head;
char trazeni_sport[MAXSIZE];
scanf("%s",trazeni_sport);
head = Ucitavanje();

ispis(head);

return 0;
}

前4行输入

Weightlifting|2008 Gold North Korea
Swimming|2008 Gold United States
Swimming|2008 Silver United States
Football|2012 Bronze South Korea 

前4行的输出

Weightlifting|2008 Gold North
Korea
Swimming|2008 Gold United
States
Swimming|2008 Silver United
States
Football|2012 Bronze South
Korea

与您的输入:

Weightlifting|2008 Gold North Korea
Swimming|2008 Gold United States

循环的第一次迭代将读取:

ime_sporta: Weightlifting
godina: 2008
osvojena_medalja: Gold
drzava: North

只有一个单词将被读入drzava,因为%s只读到第一个空白。这将在Korea之前留下读指针。在下一次迭代中,%[^|]|将读取到第一个|,因此它将读取Korea,新行和Swimming:

ime_sporta: Korea
Swimming
godina: 2008
osvojena_medalja: Gold
drzava: United

同样,只有一个单词将被读入drzava

等等,一切如预期,这里没有什么奇怪的。

之后,在打印时,在drzava后面加上new-line,因此在打印第一个元素之后,您将得到:

... North↲

,当打印下一个元素时,你要加上:

Korea↲
Swimming ...

如果您想读入drzava直到行尾的所有内容,则将最后一个%s替换为%[^n]

最新更新