从文件行中读取多个不同的单词/数字

时间:2019-06-05 07:48:26

标签: c string file input

我正在尝试从文件中读取一行文本(下面的示例)。每行文字都有:书籍标题(以大写字母开头,可以是多个单词),书籍编号,书籍的国家/地区(以大写字母开头)和书籍目录(以大写字母开头,可以是多个词)。每行以“ \ 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,国家=法国,名称=自然奇观。然后,我将在另一个函数中使用它,因此在我从第一行读取名称后就可以覆盖它,因为我不需要它。

1 个答案:

答案 0 :(得分:1)

嗯,对于SO来说,这不是一个很好的问题,因为它缺乏您真正尝试执行的操作的上下文。无论如何,我已经看过您的代码了,但是对于SO答案,有太多事情需要修复。所以我只给你一些建议。

  • 对于初学者来说最好的工具是铅笔和纸。写下您希望程序遵循的算法,并通过跟随初始数据来控制应该起作用的算法(从本文中是)。如果这样做,您将立即发现它包含一个从while (flagc == 0) {开始的无限循环,因为c在该循环中从未更改。仅在真正知道想要的内容时才开始编码

  • 您正试图一次解析一个字符的文件。这并不难,但是需要很多注意。初学者,我建议您使用标准库中尽可能多的高级功能:用fgets逐行读取文件,然后使用strcspnstrspn查找文件。数字在行中的位置。标题之前是标题,名称后面是

  • 小心缩进(许多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的字符串更容易阅读。至少您立即知道它是一个字符而不是一个真数字...

这可能不是预期的答案,我当然可以为您编写代码,但是您不会从中学到任何东西。