【发布时间】:2014-10-06 22:00:37
【问题描述】:
我在使用 fgets 从文件中读取几行文本时遇到问题。该文件是一些基本用户数据,在插件第一次启动时写入捆绑包中的文件。插件的任何后续启动都应导致用户数据被读取并交叉引用以检查用户的真实性。
数据总是3行长,用frwite完全按原样写入,用fopen打开。
我最初的理论是调用 fgets 3 次,将每一行读入它自己的 char 数组,该数组是数据结构的一部分。问题是第一行被正确读取,第二行被读取,就好像位置指示器从下一行开始但是偏移了从第 1 行读取的字符数。然后根本不读取第三行。
fgets 没有返回任何错误,并且表现得好像它已经读取了它应该拥有的数据,所以我显然遗漏了一些东西。
无论如何,这是我的代码的一部分,希望有人能对我的错误有所了解!
int length;
fgets(var.n, 128, regFile);
length = strlen(var.n);
var.n[length-1] = NULL;
fgets(var.em, 128, regFile);
length = strlen(var.em);
var.em[length-1] = NULL;
fgets(var.k, 128, regFile);
length = strlen(var.k);
var.k[length-1] = NULL;
fclose(regFile);
将每个字符串中的最后一个字符设置为 NULL 只是为了删除 /n
此代码序列输出整个第 1 行,第 2 行后半部分,第 3 行不输出。
【问题讨论】:
-
您是否检查过该文件是否有正确的 EOL 字符? dos 文本文件与 unix 文本文件或 mac 文本文件的读取方式不同。
-
注意:在某些情况下,
strlen(var.n) --> 0和var.n[length-1] = anything是一个问题。建议检查fgets()与NULL的结果,并在执行var.n[length-1] = '\0'之前测试length > 0。 -
1) 显示
var.n的定义。 2)次要,使用'\0',如var.em[length-1] ='\0';而不是NULL。 -
var.n和var.em是char *类型吗? -
可以显示文件内容吗?