读取文件并在结构

时间:2017-12-26 21:51:11

标签: c structure scanf fgetc

这是我正在做的项目的一部分。基本上我想读一个名为“Circuit”的文本文件,里面有这个:

电路标题示例

V1 1 0 24

V2 3 0 15

R1 1 2 10000

R2 2 3 8100

R3 2 0 4700

为了给你一些上下文,这些值表示这样的电路: Circuit example 我制作了一个代码,将所有这些值保存在一个结构中并打印出来,看看它们是否正确保存。

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>

    typedef struct
    {
char type, name, noMaior, noMenor;
int value;
    }line;

    int main(void)
    {
line ramo[10];
FILE *ficheiro;
int i = 0, j;
char titulo[200];

if ((ficheiro = fopen("circuit.txt", "r")) == NULL)
    printf("Error opening file!");

fgets(titulo, 199, ficheiro);
    printf("%s", titulo);

while ((fscanf(ficheiro, "%c%c %c %c %d\n", &ramo[i].type, &ramo[i].name, &ramo[i].noMaior, &ramo[i].noMenor, &ramo[i].value)) != EOF) 
    {
        i++;
        //if (fgetc(ficheiro)=='.')
        //  break;  
    }
    fclose(ficheiro);

for (j = 0; j < i; j++)
    printf("%c%c %c %c %d\n", ramo[j].type, ramo[j].name, ramo[j].noMaior, ramo[j].noMenor, ramo[j].value);

return 0;

}

它输出文件中的相同文本,这是我的意图。现在这里有一个棘手的部分,我们必须在文件的末尾添加“.end”或“。END”,所以我做了这两条注释行来扫描文件中的一个点,如果遇到一个点就停止读取它将值保存到结构时会导致一些问题。这就是我得到的结果:

电路标题示例

V1 1 0 24

2 3 0 15

1 1 2 10000

2 2 3 8100

3 2 0 4700

“break”按预期工作,因为如果我在文件中间放置一个点,它将停止读取后面发生的任何内容但遗憾的是它忽略了第一个字母,并且根据调试工具它会保存一个'' (空格)代替字母(ramo [] .type)。我试图尽可能多地了解fscanf和fgetc的行为,但我无法得出任何关于为什么会发生这种情况的结论。

PS:尝试翻译一些变量以使其更易于阅读,但有些仍然是葡萄牙语,如“ficheiro”= file。对我来说也很容易,我刚刚开始学习编码!

1 个答案:

答案 0 :(得分:1)

使用fgets读取文件中的每一行。然后,您可以检查点或使用strncmpstrcmp来测试特定值。如果未检测到该值,请使用sscanf解析该行。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

typedef struct
{
    char type, name, noMaior, noMenor;
    int value;
}line;

int main(void)
{
    line ramo[10];
    FILE *ficheiro;
    int i = 0, j;
    char titulo[200];
    char input[200];

    if ((ficheiro = fopen("circuit.txt", "r")) == NULL)
        printf("Error opening file!");

    fgets(titulo, sizeof titulo, ficheiro);
    printf("%s", titulo);

    while ( fgets ( input, sizeof input, ficheiro)) 
    {
        if ( '.' == input[0]) {//test for a dot at start of line
            break;
        }
        else {
            if (( 5 == sscanf(input, "%c%c %c %c %d"
            , &ramo[i].type, &ramo[i].name, &ramo[i].noMaior, &ramo[i].noMenor, &ramo[i].value))) {
                i++;
            }
        }
    }
    fclose(ficheiro);

    for (j = 0; j < i; j++)
        printf("%c%c %c %c %d\n", ramo[j].type, ramo[j].name, ramo[j].noMaior, ramo[j].noMenor, ramo[j].value);

    return 0;
}