这是我正在做的项目的一部分。基本上我想读一个名为“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。对我来说也很容易,我刚刚开始学习编码!
答案 0 :(得分:1)
使用fgets
读取文件中的每一行。然后,您可以检查点或使用strncmp
或strcmp
来测试特定值。如果未检测到该值,请使用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;
}