我目前正在编写一个程序来读取文件,然后将读取的信息保存到新文件中。但是,在写入第二个文件时,不会保存任何数据。
我正在使用结构来帮助分解我想要使用的文本文件
struct file{
int source;
int destination;
int type;
int port;
char data[50];
};
阅读完文件后,我创建了一个分解数据并将其打印到屏幕的功能
int parseFile(int countData, struct file *storedData)
{
FILE *in_File;
char buff[1000];
while(fgets(buff, 1000, in_File)!=NULL)
{
printf("%s", buff);
storedData[countData].source = atoi(strtok(buff, ":"));
storedData[countData].destination = atoi(strtok(0, ":"));
storedData[countData].type = atoi(strtok(0, ":"));
storedData[countData].port = atoi(strtok(0, ":"));
strcpy(storedData[countData].data, strtok(0, ":\n") );
}
}
最后我创建了一个保存文件的函数
void saveFile(int countData, struct file *storedData)
{
FILE *in_File;
char fileLocation[40];
int i = 0;
printf("\nEnter a File Name to save:");
scanf("%s", fileLocation);
if ((in_File = fopen(fileLocation, "w")) == NULL){
puts(" \n Could not point to the file.");
}else{
for(i=0;i<countData;i++)
{
fprintf(in_File, "%04d:%04d:%04d:%04d:%s \n",
storedData[i].source,
storedData[i].destination,
storedData[i].type,
storedData[i].port,
storedData[i].data );
}
}
fclose(in_File);
}
在main函数中,我使用malloc来分配struct的大小
int main()
{
struct file *storedData;
storedData = malloc(sizeof(struct file));
int countData = 0;
banner();
readFile(countData, storedData);
parseFile(countData, storedData);
saveFile(countData, storedData);
return 0;
}
获取数据并通过我的parseFile函数运行时,每行都会逐行写出来
数据输出示例:
0001:0002:0003:0021:CLS
0003:0004:0002:0180:100000000000000000030
0006:0003:0002:0041:100000000000000000019
0006:0002:0002:0060:100000000000000000020
然而,当保存到文件时,没有存储此输出,我想知道我可以做些什么来解决它
编辑:
这是readFile函数:
void readFile(int countData, struct file *storedData)
{
FILE *in_File;
char fileLocation[40];
printf("\nEnter file name: \n");
scanf("%s", fileLocation);
in_File = fopen(fileLocation, "r");
if(!in_File)
{
printf("\nError!\n");
}
}
答案 0 :(得分:3)
storedData = malloc(sizeof(struct file));
为一个文件记录分配足够的内容。
您的例程parseFile()
将重复写入该记录,但由于它永远不会递增countData
,因此它不会写任何内容 - 尽管它确实如此,但父例程将不会收到更新的countData ,因为您必须通过int *
&countData
让parseFile()
例程递增它。
由于for(i=0;i<countData;i++)
存在,您甚至从未读过一行,因为0 < 0
为假。
如果您进行了更改,只要您点击第二条记录,就会覆盖内存和coredump,因为您只在main()
同样在parseFile()
中,您必须在阅读之前打开文件!类似的东西:
in_File = fopen(inputFileName, "r");
[edit]我看到你用readFile()
更新了 - 它需要返回打开的FILE *供parseFile使用,你需要将那个FILE *传递给parseFile才能使用。