调用fscanf函数时,我的程序挂起。我不知道为什么。我正在尝试从以下文本文件中读取信息:
R1 N001 N003 20
R2 N002 N001 5
R3 N001 0 10
R4 N002 N003 10
R5 N003 N000 5
I1 0 N002 10
这是我的结构:
#include<stdlib.h>
#include<stdio.h>
#ifndef MYDATA_H_
#define MYDATA_H_
typedef struct comp{
char *name;
char *node1;
char *node2;
float val;
} ComponentType;
typedef struct ListNodeT{
ComponentType Component;
float currnet;
float voltage;
float power;
} ListNodeType;
#endif
这是我读取文本文件并填充ComponentType结构的函数。
void ReadFile (ComponentType *CircuitData, int *numEl, int *numNodes){
*numEl = 0;
*numNodes = 0;
int index= 0;
FILE *myFile = fopen("mydata.dat", "r");
if (myFile == NULL){
printf("Error: File the file is not open");
}
printf("This worked\n"); //gets to this point
while (!feof(myFile)){
fscanf(myFile,"%cf",CircuitData[index].name,
CircuitData[index].node1,CircuitData[index].node2,
&CircuitData[index].val);
printf("\nfscanf works");
*CircuitData[index].node1 = intFromString(CircuitData[index].node1);
*CircuitData[index].node2 = intFromString(CircuitData[index].node2);
if ((int)CircuitData[index].node1 > *numNodes ){
*numNodes = (int)CircuitData[index].node1;
}
if ( (int)CircuitData[index].node2 > *numNodes ){
*numNodes = (int)CircuitData[index].node2;
}
(*numEl)+=1;
index++;
}
fclose(myFile);
答案 0 :(得分:2)
您的代码中有很多错误。
让我们从fscanf
调用开始:您只有格式"%c"
读取单个字符,但您有许多要解析的值。每个变量需要一个格式代码,并且需要正确(即"%s"
表示字符串):
fscanf(myFile, " %s %s %s %f",
CircuitData[index].name,
CircuitData[index].node1,
CircuitData[index].node2,
&CircuitData[index].val);
请注意前导空格,它告诉fscanf
跳过输入中的前导空格,这是必需的,因为换行符仍然位于之前行的输入缓冲区中。
然后继续让可能导致上述代码崩溃的内容:您必须为字符串分配内存!动态分配(例如CircuitData[index].name = malloc(SOME_SIZE)
)或将它们声明为数组(例如char name[SOME_SIZE]
)。
当您使用node1
和node2
字段时,这些字段应该是整数字段(例如int node1
)。然后,您需要为fscanf
读取的字符串使用几个临时变量。标准库中有一些函数可以将字符串转换为整数,例如strtol
:
CircuitData[index].node1 = strtol(temp_node1, NULL, 10);
你的阅读循环也有问题,应该例如。
while (fscanf(...) == 4) { ... }
当然,我假设你已经为CircuitData
数组分配了内存?
您现在确实有很多其他与指针相关的错误,但如果您将node1
和node2
更改为整数,其中一些将会被解决。