从C中的文件进行结构内存分配,只有两个变量有效

时间:2014-07-09 13:08:59

标签: c struct malloc scanf realloc

我必须编写一个程序,它将从文件中读取文本,将其分解为结构,将这些部分验证为某个标准,然后生成两个新文件;一个有干净的数据,一个有错误。到目前为止,我已经达到了从文件中分解数据并将其存储到结构中的阶段,但它只适用于前两个变量。 文本用冒号分隔,我需要将每个部分放入下面的变量中 文本文件的一个例子

0001:0002:0003:0021:CLS

这是我的结构

struct packet{
int source;
int destination;
int type;
int port;
char data[50];
};

Bellow是好的,但是只要我添加另一个部分来向类型变量添加数据,该程序就无法运行。

      fscanf(inFile, "%[^:]: %[^:]:", records[i].source, records[i].destination);
                        printf("%d - %s _ %s", i+1, records[i].source, records[i].destination);

然而,这不起作用,我需要它。我需要扩展它。

             fscanf(inFile, "%[^:]: %[^:]: %[^:]:", records[i].source, records[i].destination, records[i].type);
                        printf("%d - %s _ %s _ %s", i+1, records[i].source, records[i].destination, records[i].type);
                        }

如果我在没有向结构输入任何东西的情况下打印它,它会显示为我所期望的null,因为没有任何存储因此我认为fscanf函数有问题。因为它适用于前两个,我不认为这是一个语法问题,所以它必须是一个内存问题。我已经使用了malloc和realloc,但我已经对它感到困惑,我确信我做得不对。

完整的代码清单

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

//declaration of function which will print my name and student number
const char * myname();
//declaration of a function that will prompt a user to enter a file and open it if it exists
int openfile();

struct packet{
    int source;
    int destination;
    int type;
    int port;
    char data[50];
    };


int main()
{
int recordCount = 0;

struct packet *records;
records =malloc(sizeof(struct packet));
// printing the my name and student number via the myname function
printf("%s\n", myname());
//executing the openfile function that will open a function
openfile(recordCount, records);


return 0;
}


const char * myname()
{
 const char *x = "*************************\nUSERNAME\nUSER NUMBER\nCONTACT NUMBER\n*************************\n";
 return x;
}


int openfile(int rCount, struct packet *records)
{
 //file pointer which will keep track of the file being accessed
FILE *inFile ;
//creating variable that will hold what the user has entered for a filename to open
char inFileName[100] = { '\0'};

printf("Please Enter the File to open:");
//getting the users input and storing it into the variable just created
scanf("%s", inFileName);
//if the file does not exist, display an appropriate error message
        if ((inFile = fopen(inFileName, "r")) == NULL)
        {
          printf("Cannot Open File **%s**\n", inFileName) ;
          exit(1) ;
        }

        else {
        //if the file does exist, process the data
            while(fgets(inFileName, 100, inFile)!=NULL)
                {


                int i =0;
                 for (i=0; i<30;i++)
                            {
                            fscanf(inFile, "%[^:]: %[^:]: %[^:]:", records[i].source, records[i].destination, records[i].type);
                            printf("%d - %s _ %s _ %s", i+1, records[i].source, records[i].destination, records[i].type);
                        }



                }

        //close the file
         fclose(inFile);
         return 0;
        }

};

1 个答案:

答案 0 :(得分:1)

你做错了:

fscanf(inFile, "%[^:]: %[^:]:", records[i].source, records[i].destination);

%[]转换说明符用于字符串,但是您传递的是整数值,就好像它们是字符指针一样。未定义的行为!

你应该从任何现代编译器中获得大量警告,即验证格式化字符串的编译器。

解析整数就好像它们是字符串一样没有意义,我不明白为什么你不只是在做

fscanf(inFile, "%d:%d", &records[i].source, &records.destination);

第一个案例。

另外,请注意使用fgets()读取整行后好多了,然后使用sscanf()读取一行,而不是尝试合并这两个步骤与fscanf()

最后,您应该检查转换调用的返回值,以了解转换成功的次数。