【发布时间】:2020-04-21 23:10:48
【问题描述】:
我正在尝试从 C 语言的文件中读取数据。我正在观看我的教授建议我们观看的有关使用 fscanf 将文件读入内存的示例视频。
但是我在试图弄清楚如何读取一个又一个字符串并在其间使用分隔符时遇到了问题。在示例视频中,他读取了行尾的字符串,并在遇到“\n”字符时停止。
我的 fscanf 应该返回 1 而不是 6(我认为)。我认为我阅读前两个字符串的语法有问题。
以下是我的数据表中的几行:
ggqavxbtdtks|foo|004042|4|3|
ebsawskolwre|foo|001977|4|2|
wthbjpvgkgvy|moo|021392|4|1|
ivftrtsdqwoj|woo|122665|4|1|
这是将数据读入内存的函数。
// Read file and import data into struct
int readData(struct Transaction record[], const char filepath[], const int max)
{
// Declare Variables
int amount = 0;
char ch;
// Declare filepointer
FILE* fp = fopen(filepath, "r");
if (fp != NULL)
{
while (amount < max && fscanf(fp, "%30[^|]%*c|%30[^|]%*c|%d|%d|%d|%c", record->title, record->ctg->category, &record->amount, &record->month, &record->day, &ch) == 6)
{
if (ch != '\n')
{
while (fgetc(fp) != '\n');
}
amount++;
}
fclose(fp);
fp = NULL;
}
else
{
printf("Cannot read file\n");
}
// Return number of participants
return amount;
}
这也是个人项目,不适合学校。我只是想学习新事物。
【问题讨论】:
-
%*c格式的用途是什么? -
@Shawn 我不确定,它在视频中使用并且有效,我也在以前的项目中使用过它,具有相同的结构并且没有错误。
-
@Shawn 如果我删除 '*' 我得到一个调试断言失败,缓冲区!= nullptr
-
@user3121023 删除你提到的仍然会导致调试断言失败,缓冲区!= nullptr。
-
@user3629249 我发现问题的原因是我在 ctg 上有一个指针