当前位置: 技术问答>linux和unix
Linux C新手碰到总线错误求解!!
来源: 互联网 发布时间:2017-04-22
本文导语: #include #include #include #include #include #include #include int n = 0;//共录入了多少本书的信息 int count;//记录条数 //书名 出版社 价格 存储量 作者 typedef struct { char name[20]; char pub[20]; float pr...
#include
#include
#include
#include
#include
#include
#include
int n = 0;//共录入了多少本书的信息
int count;//记录条数
//书名 出版社 价格 存储量 作者
typedef struct
{
char name[20];
char pub[20];
float price;
int stock;
char author[20];
}book;
void drawUI()
{
char *heads = "图书信息管理";
char *name = "书 名[ ]";
char *pub = "出版社[ ]";
char *price = "价 格[ ]";
char *stock = "库存量[ ]";
char *author = "作 者[ ]";
char *keepOn = "继续输入吗?y/n______";
box(stdscr,0,0);
attron(A_BOLD);
mvaddstr(3,(COLS-strlen(heads))/2,heads);
mvhline(4,(COLS-strlen(heads))/2,0,strlen(heads));
attroff(A_BOLD);
mvaddstr(8,(COLS-strlen(name))/2,name);
mvaddstr(10,(COLS-strlen(pub))/2,pub);
mvaddstr(12,(COLS-strlen(price))/2,price);
mvaddstr(14,(COLS-strlen(stock))/2,stock);
mvaddstr(16,(COLS-strlen(author))/2,author);
mvaddstr(20, COLS/2-10, keepOn);
refresh();
}
void dealInput(book* books)
{
int ch;
int i = 0;
while(1)
{
mvaddstr(8, COLS / 2 - 3, "");
//输入书名一回车就报总线错误了,这是为什么????
mvscanw (8, COLS / 2 - 3, books[i].name);
mvaddstr(10, COLS / 2 - 3, "");
mvscanw (10, COLS / 2 - 3, books[i].pub);
mvaddstr(12, COLS / 2 - 3, "");
mvscanw (12, COLS / 2 - 3, (char*)&(books[i].price));
mvaddstr(14, COLS / 2 - 3, "");
mvscanw (14, COLS / 2 - 3, (char*)&(books[i].stock));
mvaddstr(16, COLS / 2 - 3, "");
mvscanw (16, COLS / 2 - 3, books[i].author);
i++;
count++;
ch = mvgetch(20, COLS/2+5);
if('n' == (char)ch)
{
n = i;
break;
}
refresh();
}
}
int main()
{
int fd;
book* s = NULL;//文件在虚拟内存的映射首地址
struct stat st;
int size;//文件大小
int i;
//1.打开文件
fd = open("book.dat", O_RDWR|O_CREAT|O_EXCL, 0666);
if(fd == -1)
{
fd = open("book.dat", O_RDWR);
if(fd == -1) printf("::%mn"), exit(-1);
}
//2.得到文件大小,文件记录条数
fstat(fd, &st);
size = st.st_size;
count = size/sizeof(book);
//4.映射到一个虚拟的地址,假设一次最多允许录入100本书的信息
s = (book*)mmap(0, size+100*sizeof(book), PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0);
//5.把数据写入虚拟地址
initscr();
drawUI();
dealInput(s);
//3.文件大小改变只要在munmap之前调用都有效
//实际录入了n本书的信息,所以文件大小只要扩大n个book这么多
ftruncate(fd,size + n*sizeof(book));
endwin();
//6.卸载虚拟地址
munmap(s, 100*sizeof(book)+size);
//7.关闭文件
close(fd);
return 0;
}
|
mvscanw不会用吗?和scanf一样