C阅读文本文件

时间:2018-05-26 15:56:05

标签: c

我想读取包含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
                });

2 个答案:

答案 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号之间引入空格(例如换行符)。

如果这不是一个选项,则必须手动解析字符串中的数字(例如找到第一个数字并在那里分割字符串)。这可以通过文件中的逐字符读取,或者通过将数据作为字符串读入内存并在那里处理来完成。