我必须编写一个程序,它将从文件中读取文本,将其分解为结构,将这些部分验证为某个标准,然后生成两个新文件;一个有干净的数据,一个有错误。到目前为止,我已经达到了从文件中分解数据并将其存储到结构中的阶段,但它只适用于前两个变量。 文本用冒号分隔,我需要将每个部分放入下面的变量中 文本文件的一个例子
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;
}
};
答案 0 :(得分:1)
你做错了:
fscanf(inFile, "%[^:]: %[^:]:", records[i].source, records[i].destination);
%[]
转换说明符用于字符串,但是您传递的是整数值,就好像它们是字符指针一样。未定义的行为!
你应该从任何现代编译器中获得大量警告,即验证格式化字符串的编译器。
解析整数就好像它们是字符串一样没有意义,我不明白为什么你不只是在做
fscanf(inFile, "%d:%d", &records[i].source, &records.destination);
第一个案例。
另外,请注意使用fgets()
读取整行后好多了,然后使用sscanf()
读取一行,而不是尝试合并这两个步骤与fscanf()
。
最后,您应该检查转换调用的返回值,以了解转换成功的次数。