在 C 语言中扫描文本文件中的值时如何清除输入缓冲区?


#include <stdio.h>
#define MAX_TITLE_SIZE 20
#define MAX_BOOKS 10
struct Book {
int _isbn;
float _price;
int _year;
char _title[MAX_TITLE_SIZE + 1];
int _qty;
};
void clear(void);
int readRecord(FILE *fp, struct Book *b2read);
void displayInventory(const char filename[]);

int main(void) {
struct Book myBook;
char filename[21] = "144_w9_inventory.txt";
displayInventory(filename);
return 0;
}
void clear(void) {
while (getchar() != 'n');
}
int readRecord(FILE *fp, struct Book *b2read){
//Define a variable int rv = 0
int rv = 0;

rv = fscanf(fp, "%d;%f;%d;%d;%20[^n]", &(b2read->_isbn), &(b2read->_price), &(b2read->_year), &(b2read->_qty), b2read->_title);
//return rv;
return rv;
}
void displayInventory(const char filename[]) {
struct Book myBook;
FILE *fp = NULL;
int i;
fp = fopen(filename, "r");  //open the file for reading
if (fp != NULL) {
printf("nnInventoryn");
printf("===================================================n");
printf("ISBN      Title               Year Price  Quantityn");
printf("---------+-------------------+----+-------+--------n");
while(readRecord(fp, &myBook) == 5){
printf("%-10.0d%-20s%-5d$%-8.2f%-8dn", myBook._isbn, myBook._title, myBook._year, myBook._price, myBook._qty); 
}
printf("===================================================n");
printf("n");
fclose(fp);
}
else {
printf("Failed to open filen");
}
}

文本文件内部的内容是:

234562;23.99;2010;3;Harry Potter
567890;12.67;2015;4;The Hunger Games
109821;53.20;2017;2;Stranger Things

输出:

Inventory
===================================================
ISBN      Title               Year Price  Quantity
---------+-------------------+----+-------+--------
234562    Harry Potter
2010 $23.99   3       
567890    The Hunger Games
2015 $12.67   4       
109821    Stranger Things     2017 $53.20   2       
===================================================

当我输出程序时,我能够获取所有值,但由于某种原因,当我打印这些值时,整个字符串减半并向下移动一行。

如果您想看一看,repl.it 在这里:

https://repl.it/JbRy/69

如何让输出以单行打印出来;如果是这种情况,则读取"换行符"?

它与"清除输入缓冲区"无关。fscanf()根据您指定的内容使用它。它不需要"清除",它需要正确扫描。不知何故,您在标题中获得了行终止符。更正fscanf()格式字符串。

当你fscanf时,少了一点东西。您应该在[^n]中包含r。 这将告诉fscanf,当遇到回车符或换行符时,您希望停止读取。

喜欢这个:

rv = fscanf(fp, "%d;%f;%d;%d;%20[^nr]", &(b2read->_isbn), &(b2read->_price), &(b2read->_year), &(b2read->_qty), b2read->_title);

"哈利波特"和"怪奇物语"之间的区别在于"怪奇物语"在文本文件中没有换行符。 "哈利波特"和"饥饿游戏"似乎还剩下"\r"。

试试这个。

rv = fscanf(fp, "%d;%f;%d;%d;%20[^rn]", &(b2read->_isbn), &(b2read->_price), &(b2read->_year), &(b2read->_qty), b2read->_title);

最新更新