我无法使用fget从文件中读取几行文本。该文件是一些基本用户数据,这些数据在首次启动插件时便写入捆绑包中的文件中。插件的任何后续启动都应导致读取和交叉引用用户数据以检查用户的真实性。

数据始终为3行,并按应有的方式用frwite写入,并用fopen打开。

我最初的理论是只调用fgets 3次,将每行读入它自己的char数组中,该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行。

最佳答案

在包括Linux的POSIX系统中,二进制文件和文本文件之间没有区别。打开文件流时,b标志将被忽略。在fopen()中对此进行了描述。

您可能会问“如何区分文本和二进制文件?”。内容与众不同。内容的写入方式使它们成为二进制或文本文件。

查看签名size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)。您会注意到,它使用*ptr写入size的内容来描述每个成员nmemb的大小。写入的流不会转换为字符串。如果要编写97,它将编写二进制97,其ascii为A。二进制数据不服从字符串终止。数据中\n\0的存在按原样写。

现在查看签名int fputs(const char *s, FILE *stream)。它写入*s的字符串内容。如果要编写97,则必须为字符串“ 97”,而不是A。遵守字符串终止。 \n自动转换为O / S支持的换行符(CRLF或LF)。

您可以强制fwrite()使其表现得像fputs(),但反之则不行。例如,如果您将ptr声明为指向字符串的指针,并且将其大小精确地计算为内容的长度(不包括字符串终止符),则可以将其写为文本而不是二进制。您还需要处理\0\n并将它们转换为O / S支持的换行符。写入整个字符串缓冲区将写入包括字符串终止符在内的所有内容。

关于c - fget不读行的开头,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/26225558/

10-11 03:58