gpt4 book ai didi

c - fgets() 在 fscanf() 之后不起作用

转载 作者:行者123 更新时间:2023-11-30 16:34:42 24 4
gpt4 key购买 nike

我使用 fscanf 读取日期,然后使用 fgets 读取注释。然而,在第一次迭代之后,fscanf 返回值 -1。

我使用GDB一步步调试程序。在第一次使用 fgets 之前它工作正常。当我尝试打印出 fgets 在第一次迭代中读取的行时,它给了我这个:

(gdb) print line
$6 = "\rtest\r18/04/2010\rtest2\r03/05/2010\rtest3\r05/08/2009\rtest4\r\n\000\000\000\000q\352\261\a\370\366\377\267.N=\366\000\000\000\000\003\000\000\000\370xC\000\000\000\000\000\000\000\000\000\001\000\000\000\227\b\000\000\070\367\377\267H\364\377\267\362\202\004\bdoD\000\354\201\004\b\001\000\000\000\304oC\000p\363\377\277\260zC\000D\363\377\277\n!B\000\064\363\377\277\354\201\004\b(\363\377\277TzC\000\000\000\000\000\070\367\377\267\001\000\000\000\000\000\000\000\001\000\000\000\370xC\000\001\000\000\000\000\000\312\000\000\000\000\000\377\260\360\000\001\000\000\000\277\000\000\000\364\317\000\000\344\261\\\000\000\000\000\000p\363\377\277|\233\004\b\350\362\377\277 \204\004\b\005\000\000\000|\233\004\b\030\363\377\277"

看起来 fgets 读取了剩余的条目,然后将它们全部存储在一个字符串中。

我不知道为什么要这样做。

主要代码如下:

int main(int argc, char* argv[]) {
FILE* file;
int numEntries, i = 0;
int index = atoi(argv[1]);
char line[SIZE];
JournalEntry *entry;

/*argument provided is the entry user wants to be displayed*/
if (argc > 2) {
perror("Error: Too many arguments provided");
}
file = fopen("journalentries.txt", "r");
if (file == NULL) {
perror("Error in opening file");
}

if (fscanf(file, "%d", &numEntries) != 1) {
perror("Unable to read number of entries");
}

entry = (JournalEntry*)malloc(numEntries * sizeof(JournalEntry));
if (entry == NULL) {
perror("Malloc failed");
}

for (i = 0; i < numEntries; i++) {
if (fscanf(file, "%d/%d/%d", &entry[i].day, &entry[i].month, &entry[i].year) != 3) {
perror("Unable to read date of entry");
}

if (fgets(line, sizeof(line), file) == NULL) {
perror("Unable to read text of entry");
}
}

printf("%d-%02d-%02d %s: ", entry[index].year, entry[index].month, entry[index].day, entry[index].text);

if(ferror(file)) {
perror("Error with file");
}

fclose(file);
free(entry);

return 0;
}

我必须阅读的文件:第一行包含要读取的条目数

4
12/04/2010
test
18/04/2010
test2
03/05/2010
test3
05/08/2009
test4

JournalEntry 结构体位于头文件中:

typedef struct {
int day;
int month;
int year;
char text[250];
} JournalEntry;

最佳答案

It looks like fgets reads the remaining entries and then stores them all in a single string.

是的,'\r' 不是行终止符。因此,当 fscanf 在第一个无效字符处停止解析并将它们留在缓冲区中时,fgets 将读取它们直到行尾。由于文件中没有有效的行终止符,因此直到文件末尾为止。

您可能应该修复文件以具有有效的(Unix?)行结尾,例如使用合适的文本编辑器可以做到这一点。但这是另一个问题,之前已被问过(例如 here ),并且取决于您的问题中未包含的详细信息。

此外,您需要双重检查 fscanf 返回值。仅当返回值为-1时才使用perror,否则错误消息将与错误完全无关。如果返回值是 >=0 但与您想要的不同,则打印自定义错误消息“无效的输入语法”或其他内容(并且可能使用 fgets 读取其余部分行出缓冲区)。

此外,为了可靠地混合 scanffgets,我需要在 fscanf 格式字符串中添加空格,这样它就会读取行末尾的任何空格(也包括下一行的开头和任何空行,所以如果重要的话要小心),如下所示:

int items_read = scanf("%d ", &intvalue);

正如另一个答案中所述,最好仅使用 fgets 读取行,然后使用 sscanf 逐行解析它们。

关于c - fgets() 在 fscanf() 之后不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49220733/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com