2017-07-21 74 views
-2
#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("\n\nInventory\n"); 
     printf("===================================================\n"); 
     printf("ISBN  Title    Year Price Quantity\n"); 
     printf("---------+-------------------+----+-------+--------\n"); 

     while(readRecord(fp, &myBook) == 5){ 
     printf("%-10.0d%-20s%-5d$%-8.2f%-8d\n", myBook._isbn, myBook._title, myBook._year, myBook._price, myBook._qty); 
     } 
     printf("===================================================\n"); 
     printf("\n"); 

     fclose(fp); 
    } 
    else { 
     printf("Failed to open file\n"); 
    } 
} 

什么是文本文件,里面是:如何从C文本文件中扫描值时清除输入缓冲区?

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

我如何得到输出单行打印出来;而不是阅读\ n“新行”,如果是这样的话?

+1

这个代码看起来很好,和我的系统上按预期工作。无法复制;你确定这与你在运行代码的在线测试环境没有关系吗? –

+0

你是对的@DavidBowling,它在Visual Studio上工作,但它在repl.it环境中编译的方式不同。我使用repl.it来测试我的输出,而不是每次我想测试某些东西时都必须创建一个VS的新实例。 – mincedMinx

回答

-1

'哈利波特'和'陌生的东西'之间的区别是'陌生的东西'在文本文件中没有换行符。 '哈利波特'和'饥饿游戏'似乎还剩'\ r'。

试试这个。

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

'\ r'不是换行符。 – Olaf

+0

https://en.wikipedia.org/wiki/Carriage_return – gwangsoo

+0

很难看出这将如何解释OP的问题。如果在输入文件中换行符是\ r \ n,那么错过的\ r将导致光标移动到当前行的开始位置,而不是前进到下一行的开始位置。有些东西似乎对输入文件,在线测试环境或两者都有点腥意。 –

-1

它与'清除输入缓冲区'无关。 fscanf()根据您指定的内容消耗它。它不需要'清除',它需要正确扫描。不知何故,你在标题中注明了行结束符。更正您的fscanf()格式字符串。

-1

fscanf时,有一点遗漏。您应该在[^\n]中包含\r。 这将告诉fscanf当遇到回车或换行时,您想要停止阅读。

像这样:

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