我正在尝试从文件中读取一行文本(下面的示例)。每行文字都有:书籍标题(以大写字母开头,可以是多个单词),书籍编号,书籍的国家/地区(以大写字母开头)和书籍目录(以大写字母开头,可以是多个词)。每行以“ \ n”结尾,下一行开始。我想阅读该行以及单独的标题,号码,国家和名称。如何正确执行?
我尝试按char读取char,并且当我当前正在读取的char是数字或大写字母且先前的char是“空格”时,标志应升起以表示我应从例如标题转到数字,国家编号等。当我读到“ \ n”时,所有标志都应下降,并且该过程应重新开始
void openfile(char* filedestination)
{
FILE *file = fopen(filedestination, "r+");
int help[100];
int c;
int name[100];
char title[50];
int country[50];
int number[6];
int i = 0, flagt = 0 , flagn = 0 , flagc = 0, flagname = 0;
if (file == NULL)
{
printf("Opening error");
exit(-1);
}
while((c = fgetc(file))!=EOF)
{
help[i] = c;
if (flagt == 0) {
for (int j = 0; j < i; j++) {
name[j] = help[j];
if (c > 47 && c < 91 && help[i - 1] == 32) {
flagt = 1;
j = 100;
}
}
}
if (flagc == 0)
{
int j = 0;
while (flagc == 0) {
number[j] = help[i];
if (c > 47 && c < 91 && help[i - 1] == 32) {
flagc = 1;
}
j++;
i++;
}
}
i++;
printf("\n");
for (int j = 0; j < i; j++) {
printf("%c", name[j]);
}
for (int j = 0; j < i; j++) {
printf("%c", country[j]);
}
fclose(file);
}
}
示例行:
山10002法国自然奇观
光子晶体10003德国科学
所以我应该得到标题=山脉,数字= 10002,国家=法国,名称=自然奇观。然后,我将在另一个函数中使用它,因此在我从第一行读取名称后就可以覆盖它,因为我不需要它。
答案 0 :(得分:1)
嗯,对于SO来说,这不是一个很好的问题,因为它缺乏您真正尝试执行的操作的上下文。无论如何,我已经看过您的代码了,但是对于SO答案,有太多事情需要修复。所以我只给你一些建议。
对于初学者来说最好的工具是铅笔和纸。写下您希望程序遵循的算法,并通过跟随初始数据来控制应该起作用的算法(从本文中是)。如果这样做,您将立即发现它包含一个从while (flagc == 0) {
开始的无限循环,因为c
在该循环中从未更改。仅在真正知道想要的内容时才开始编码
您正试图一次解析一个字符的文件。这并不难,但是需要很多注意。初学者,我建议您使用标准库中尽可能多的高级功能:用fgets
逐行读取文件,然后使用strcspn
和strspn
查找文件。数字在行中的位置。标题之前是标题,名称后面是
小心缩进(许多IDE或编辑器都可以自动缩进代码)。如果文件正确缩进,您将立即看到fclose
调用位于主循环内。因此,您当前的代码会在第一个字符后关闭文件。
使用较短的函数。如果功能太大,请尝试将其拆分。此处的解析函数应解析一行并返回标题,编号和名称。这样,高级算法就会变成:
open file
loop line by line
extract title, number and name from a line
process title, number and name
close file
然后记下解析算法以从一行中提取字段
当出现问题(是的,即使您遵循我的建议,它们也会...),请使用调试器单步执行代码。如果您拥有...,无限循环将是显而易见的...
重要性不高,但好的做法建议避免在代码中使用魔术数字。知道ascii码表很高兴,但是' '
的空格比32的字符串更容易阅读。至少您立即知道它是一个字符而不是一个真数字...
这可能不是预期的答案,我当然可以为您编写代码,但是您不会从中学到任何东西。