读取文件和保存结构值的问题

Issue with reading a file and saving values on structure

这是我正在做的项目的一部分。本质上我想读取一个名为 "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) 的位置保存一个 ' ' (a space)。我试图尽可能多地了解 fscanf 和 fgetc 的行为,但我无法就为什么会发生这种情况得出任何结论。

PS:试图翻译一些变量以使其更易于阅读,但有些仍然是葡萄牙语,例如 "ficheiro"=file。也请放轻松,我刚开始学习编码!

使用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;
}