c语言fscanf fprintf 乱码问题

dzc2533 2008-03-24 08:14:38
用fprintf把结构体数组node中内容写入文件dd.txt,再用fscanf把dd.txt中内容读出到结构体数组outer中却出现乱码。
完整代码如下:
#include "stdlib.h"
#include "stdio.h"


typedef struct node
{
int no;
char *name;
}Node;

void main()
{
int i =0;
FILE * fp;
Node node[2];
Node outer[2];


node[0].no = 1;
strcpy(node[0].name,"node1");
node[1].no = 2;
strcpy(node[1].name,"node2");



for(i = 0;i < 2;i ++)
printf("node[%d] name is : %s \n",i,node[i].name);

/*write the record to the file*/

fp = fopen("dd.txt","w");
for(i = 0;i < 2 ;i++)
fprintf(fp,"%d %s ",node[i].no,node[i].name);
fclose(fp);


/* read the record from the file*/

if((fp = fopen("dd.txt","r"))==NULL)
printf("error to open dd.txt");

for(i = 0;i < 2;i++)
fscanf(fp,"%d %s",&outer[i].no ,outer[i].name);
fclose(fp);
for(i = 0;i < 2;i ++)
printf("outer[%d] name is %s \n",i,outer[i].name);

getch();

}

另外,如果把上面程序的读文件部分放到另一个c程序中运行却可以正确读出已存在的dd.txt中的内容。
求助!
...全文
1118 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
abupie 2008-03-24
  • 打赏
  • 举报
回复
typedef struct node
{
int no;
char *name;//改成 char name[256]; 或者直接用string吧.
}Node;

string更方便和安全.
rogina 2008-03-24
  • 打赏
  • 举报
回复
服了你了,结构体中的指针都没有分配空间就调用strcpy()了。。
不乱才怪~~
lala_benben 2008-03-24
  • 打赏
  • 举报
回复
你把
typedef struct node
{
int no;
char *name;//改成 char name[256];
}Node;
或者
node[0].name = (char*)malloc(strlen("nodel") + 1);
node[1].name = (char*)malloc(strlen("node2") + 1);
Supper_Jerry 2008-03-24
  • 打赏
  • 举报
回复
#include "stdlib.h" 
#include "stdio.h"
#include "string.h"

typedef struct node
{
int no;
char *name;
}Node;

void main()
{
int i =0;
FILE * fp;
Node node[2];
Node outer[2];


node[0].no = 1;
int len = strlen("node1")+1;
node[0].name = new char[len];
outer[0].name = new char[len];
strcpy(node[0].name,"node1");
node[1].no = 2;
len = strlen("node1")+1;
node[1].name = new char[len];
outer[1].name = new char[len];
strcpy(node[1].name,"node2");



for(i = 0;i < 2;i ++)
printf("node[%d] name is : %s \n",i,node[i].name);

/*write the record to the file*/

fp = fopen("dd.txt","w");
for(i = 0;i < 2 ;i++)
fprintf(fp,"%d %s ",node[i].no,node[i].name);
fclose(fp);


/* read the record from the file*/

if((fp = fopen("dd.txt","r"))==NULL)
printf("error to open dd.txt");

for(i = 0;i < 2;i++)
fscanf(fp,"%d %s",&outer[i].no ,outer[i].name);
fclose(fp);
for(i = 0;i < 2;i ++)
printf("outer[%d] name is %s \n",i,outer[i].name);

free(node[0].name);
free(node[1].name);
free(outer[0].name);
free(outer[1].name);
}
这样就可以了。
lala_benben 2008-03-24
  • 打赏
  • 举报
回复
。。。。你的node[0].name, node[1].name都没分配空间。。。。怎么拷贝字符串
Supper_Jerry 2008-03-24
  • 打赏
  • 举报
回复
node[0].no = 1;
strcpy(node[0].name,"node1");
node[1].no = 2;
strcpy(node[1].name,"node2");
name没有申请内存。
dzc2533 2008-03-24
  • 打赏
  • 举报
回复
懂了
谢谢大家
尤其是3楼
今天在图书馆看了点资料想到可能是NULL指针的问题
但还是没想到outer[i].name也要初始化
谢谢!

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧