【发布时间】:2016-01-29 00:39:30
【问题描述】:
给定一个 4 行的文本文件:以逗号 (,) 作为分隔符。我通过使用 fgets 抓取每一行并将 ISBN (978-xxxxxxxxxx) 与用户提供的 ISBN (978-xxxxxxxxxx) 来定位特定的 ISBN。这工作正常。
即使 fgets() 到文件的最后一行。它仍然返回正确的信息。但是,当我试图将字符串的每个元素过滤到其受人尊敬的结构成员中以通过套接字发送时。最后一个元素返回所有正确的内容,直到最后 4 个元素/字段。除了文件的最后一行之外,不会出现此错误。
我认为这是一个 EOF 错误,但是我并不精通 sscanf() 来理解为什么会这样。
如果我要打印出 linebuf,它会返回正确的(未解析的)行。 但是,如果我打印出所有数据。它返回第三行数据的一部分。具体来说,版本、份数、可用份数
9780132126953,Andrew Tanenbaum & David Wetherall,Computer Networks,5,2011,Prentice-Hall,5,2
9780123745408,Michael Donahoo & Kenneth Calvert,TCP/IP Sockets in C,2,2009,Morgan Kaufman,3,0
9780133354690,William Stallings,Cryptography and Network Security,6,2014,Prentice-Hall,3,3
9780072467505,Yale Patt & Sanjay Patel,Introduction to Computing Systems from bits & gates to C & beyond 2,2004,McGraw-Hill,1,0
我的代码:
while (fgets(linebuf, 1024, file) != NULL) {
sscanf(linebuf, "%[^,], %[^,], %[^,], %u, %u, %[^,], %u, %u\n",
bufferISBN, bufferAuthor, bufferTitle,
&bufferEdition, &bufferYear, bufferPublisher,
&bufferInventory, &bufferAvailable
);
if (strcmp(temp->isbn, bufferISBN) == 0) { // found correct line, add data to struct
mssg.respType = Okay; // enum
mssg.requestID = temp->requestID;
strcpy(mssg.isbn, bufferISBN); // needs fixing
strcpy(mssg.authors, bufferAuthor);
strcpy(mssg.title, bufferTitle);
strcpy(mssg.publisher, bufferPublisher);
mssg.edition = bufferEdition;
mssg.year = bufferYear;
mssg.inventory = bufferInventory;
mssg.available = bufferAvailable;
}
注意 sscanf() 的格式,我也不确定这是否正确:
"%[^,], %[^,], %[^,], %u, %u, %[^,], %u, %u\n"
我也知道我正在使用大量的 buffer 变量。
编辑:当我限制标题的长度时。它返回正常。这是为什么呢?
【问题讨论】:
-
你真的应该检查 sscanf 的返回值
-
我有,我现在面临的问题是当我通过 bufferISBN 到 mssg.isbn 的 strcpy() 时。 ISBN+标题被存储。但是,如果我打印出 bufferISBN,它只会返回 ISBN