我正在尝试使用特定格式读取名为“data”的文件中的某些数据。此文件中的数据是:
0 mpi_write() 100
1 mpi_write() 200
2 mpi_write() 300
4 mpi_write() 400
5 mpi_write() 1000
然后代码如下:
#include<stdlib.h>
#include<stdio.h>
typedef struct tracetype{
int pid;
char* operation;
int size;
}tracetyper;
void main(){
FILE* file1;
file1=fopen("./data","r");
if(file1==NULL){
printf("cannot open file");
exit(1);
}else{
tracetyper* t=(tracetyper*)malloc(sizeof(tracetyper));
while(feof(file1)!=EOF){
fscanf(file1,"%d %s %d\n",&t->pid,t->operation,&t->size);
printf("pid:%d,operation:%s,size:%d",t->pid,t->operation,t->size);
}
free(t);
}
fclose(file1);
}
当使用gdb运行时,我发现fscanf不会将数据写入t-> pid,t-&gt;操作和t-&gt;大小。我的代码有什么问题或什么?请帮帮我!
答案 0 :(得分:5)
您的程序有未定义的行为:您正在将%s
数据读入未初始化的char*
指针。您需要使用operation
分配malloc
,或者如果您知道最大长度是20个字符,则可以将固定字符串放入结构本身:
typedef struct tracetype{
int pid;
char operation[21]; // +1 for null terminator
int size;
} tracetyper;
当您阅读%s
数据时,您应该始终告诉fscanf
长度限制,例如:
fscanf(file1,"%d %20s %d\n",&t->pid,t->operation,&t->size);
最后,您应该删除字符串末尾的\n
,并检查返回值的计数,而不是检查feof
,如下所示:
for (;;) { // Infinite loop
...
if (fscanf(file1,"%d %20s %d",&t->pid,t->operation,&t->size) != 3) {
break;
}
...
}
答案 1 :(得分:-1)
你应该循环使用:
while ( (fscanf(file1,"%d %s %d\n",&t->pid,t->operation,&t->size)) != EOF) {
printf("pid:%d,operation:%s,size:%d",t->pid,t->operation,t->size);
}
您还需要在结构中为char数组添加malloc。
另外,插入t
作为
if (t == NULL)
cleanup();