我想读取包含id号和名称的文本文件,并逐行打印这些信息。我在下面写了代码,但输出是空的。我无法找出它为什么不起作用。
文本文件(firm.txt):
101 eti300 superfresh502 pinar91 banvit
代码:
$("#txtbox").autocomplete({
source: function (request, response) {
$.ajax({
type: "POST",
contentType: "application/json; charset=utf-8",
url: "url.aspx/GetData",
data: "{'Prefix':'" + request.term + "'}",
dataType: "json",
success: function (data) {
$.each(data, function (i, field) {
var data = JSON.stringify(data);
console.log(data.diagnosisdesc);
});
},
error: function (result) {
alert("Error");
}
});
},
minLength: 3
});
答案 0 :(得分:2)
您的代码有多个问题:
循环测试不正确:Why is “while ( !feof (file) )” always wrong?您应该在fscanf()
测试表达式中调用while
,并将返回值与2
进行比较。
文件内容与您尝试解析的格式不匹配:
第一个101
将匹配%d
,然后eti300
匹配%s
,但下一次调用fscanf()
失败,因为superfresh502
与%d
不匹配1}}以及任何后续调用都会失败,因为输入流中的违规输入仍处于暂挂状态。
firmName
是一个未初始化的指针,将其作为目标传递给fscanf
%s
转换说明符具有未定义的行为。
以下是修改后的版本:
#include <stdio.h>
//prototypes
void readFirms(char *filename);
int main(void) {
readFirms("C:\\Users\\hakan\\Desktop\\firms.txt");
return 0;
}
void readFirms(char *filename) {
FILE *firmFilePtr;
if ((firmFilePtr = fopen(filename, "r")) == NULL) {
puts("File could not be opened.");
} else {
unsigned int firmId;
char firmName[100];
while (fscanf(firmFilePtr, "%d%99s", &firmId, firmName) == 2) {
printf("%d %s\n", firmId, firmName);
}
fclose(firmFilePtr);
}
}
答案 1 :(得分:0)
fscanf("%s", ...)
读取一个字符串:读取所有对字符串有效的字符,直到遇到空格(或文件结束)。请注意,eti300
是一个完全有效的字符串,因此,所有字符串都由第一个fscanf
使用。这样就不会为第二个fscanf
留下任何数字,因此它会出错。
如果可以,请更改数据格式,以在名称和其后的下一个ID号之间引入空格(例如换行符)。
如果这不是一个选项,则必须手动解析字符串中的数字(例如找到第一个数字并在那里分割字符串)。这可以通过文件中的逐字符读取,或者通过将数据作为字符串读入内存并在那里处理来完成。