0

调用 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);
4

1 回答 1

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])。

当您使用node1andnode2字段时,这些字段实际上应该是整数字段(例如int node1)。然后,您需要为您读取的字符串添加几个临时变量fscanf。标准库中有一些函数可以将字符串转换为整数,例如strtol

CircuitData[index].node1 = strtol(temp_node1, NULL, 10);

您的阅读循环也有问题,应该例如

while (fscanf(...) == 4) { ... }

当然,我假设您已经为CircuitData数组分配了内存?

您现在确实有很多其他与指针相关的错误,但是如果您更改node1node2成为整数,其中一些将得到解决。

于 2013-10-15T09:30:27.647 回答