请教往文件中写数据或读出时出现一些莫名其妙的字符时怎么解决??!
请教往文件中写数据或读出时出现一些莫名其妙的字符时怎么解决??! 问题点数:30、回复次数:17Top
1 楼fierygnu(va_list)回复于 2003-12-02 18:15:11 得分 0
贴代码。Top
2 楼antijpn(antijpn)回复于 2003-12-02 18:19:49 得分 20
你打开的可能不是文本文件,所以会有那些莫名其妙的字符,或者可能是包含汉字的文件,需要用wchar来保存,也有可能根本就不是文本,所以只能使用二进制打开和读取Top
3 楼jsjwql(wql)回复于 2003-12-02 18:28:43 得分 0
#include"stdio.h"
#include"malloc.h"
#define LENGTH sizeof(struct node)
struct node
{
char name[10];
char adr[20];
char tel[13];
char email[20];
struct node *next;
};
typedef struct node NODE;
int N;
save(NODE *head)
{
char name[10];
NODE *p,*q;
FILE *fp;
p=q=head;
printf("please enter the name you want to save:\n");
scanf("%s",&name);
fp=fopen(name,"wb");
while(p->next!=NULL)
{
fprintf(fp,"%s%s%s%s",p->name,p->adr,p->tel,p->email);
p=q->next;
q=p;
}
fclose(fp);
}
display(NODE *head)
{
NODE *p ;
p=head;
printf("\n\n******name*************address************telephone*********email*************\n");
while(p!=NULL)
{
printf(" %s %s %s %s\n",p->name,p->adr,p->tel,p->email);
p=p->next ;
}
}
NODE *load()
{
char name[10];
NODE *p,*q,*r;
FILE *fp1;
p=q=r=(NODE *)malloc(LENGTH);
N=0;
printf("\n please enter the file name:");
scanf("%s",name);
fp1=fopen(name,"rb");
if(fp1==NULL)
{
printf("\nthe file doesn't exist!");
exit();
}
else
{
while(!feof(fp1))
{
N++;
if(N!=1)
{
p=(NODE *)malloc(LENGTH);
p=q->next;
q=p;
}
fscanf(fp1,"%s%s%s%s",p->name,p->adr,p->tel,p->email);
printf(" %s \t %s \t %s \t %s\n",p->name,p->adr,p->tel,p->email);
}
p->next=NULL;
}
fclose(fp1);
return(r);
}
main()/*实现创建一个新链表*/
{
NODE *p,*q,*r,*s;
char name[10];
N=0;
printf("please enter the name(if you want exit,please enter 0)(<=10):");
scanf("%s",name);
while(strcmp(name,"0")!=0)
{
N++;
p=(NODE *)malloc(LENGTH);
strcpy(p->name,name);
printf("please enter his address(<=20):");
scanf("%s",p->adr);
printf("please enter his tel(<=13):");
scanf("%s",p->tel);
printf("please enter his email(<=20):");
scanf("%s",p->email);
if(N=1) r=p;
else q->next=p;
q=p;
printf("please enter the name(if you want exit,please enter 0)(<=10):");
scanf("%s",name);
}
p->next=NULL;
display(r);//把输入的内容显示出来
s=load();//打开原来的文件
display(s);//显示打开的内容
getch();//由于我的系统是xp就加了个这个
}Top
4 楼jsjwql(wql)回复于 2003-12-02 18:31:29 得分 0
二进制与字符的格式都用了!不知道是什么问题!谢谢Top
5 楼jsjwql(wql)回复于 2003-12-02 18:34:31 得分 0
display(r);//把输入的内容显示出来
s=load();//打开原来的文件
display(s);//显示打开的内容
getch();//由于我的系统是xp就加了个这个
在少贴了个东西save(r)
display(r);//把输入的内容显示出来
save(r);//把链表中的东西保存起来
s=load();//打开原来的文件
display(s);//显示打开的内容
getch();//由于我的系统是xp就加了个这个Top
6 楼chenzhuo(睡到自然醒)回复于 2003-12-02 19:00:57 得分 0
struct node
{
char name[10];
char adr[20];
char tel[13];
char email[20];
struct node *next;
};
这里的定义出问题,如果你定义了char name[10]这时候你不可以输入一个10字符给name.
不然就会出现这种情况,如果是10个字符以下就没问题.因为它要存'\0'.
你试一下定义为char name[11];
输入时就这样
do {scanf("%s",xxx.name);}while(!(strlen(xxx.name)>0&&strlen(xxx.name)<11));Top
7 楼jsjwql(wql)回复于 2003-12-02 20:33:14 得分 0
谢谢
但是我使用的名字在10以内的时候都不行
上面的代码帖的时候好象有点问题,下面的通过编译了,你们可以运行看看,是个什么情况
#include"stdio.h"
#include"malloc.h"
#define LENGTH sizeof(struct node)
struct node
{
char name[10];
char adr[20];
char tel[13];
char email[20];
struct node *next;
};
typedef struct node NODE;
int N;
save(NODE *head)
{
char name[10];
NODE *p,*q;
FILE *fp;
p=q=head;
printf("please enter the name you want to save:\n");
scanf("%s",&name);
fp=fopen(name,"wb");
while(p->next!=NULL)
{
fprintf(fp,"%s%s%s%s",p->name,p->adr,p->tel,p->email);
p=q->next;
q=p;
}
fclose(fp);
}
display(NODE *head)
{
NODE *p ;
p=head;
printf("\n\n******name*************address************telephone*********email*************\n");
while(p!=NULL)
{
printf(" %s %s %s %s\n",p->name,p->adr,p->tel,p->email);
p=p->next ;
}
}
NODE *load()
{
char name[10];
NODE *p,*q,*r;
FILE *fp1;
p=q=r=(NODE *)malloc(LENGTH);
N=0;
printf("\n please enter the file name you want to open:");
scanf("%s",name);
fp1=fopen(name,"rb");
if(fp1==NULL)
{
printf("\nthe file doesn't exist!");
exit();
}
else
{
while(!feof(fp1))
{
N++;
if(N!=1)
{
p=(NODE *)malloc(LENGTH);
p=q->next;
q=p;
}
fscanf(fp1,"%s%s%s%s",p->name,p->adr,p->tel,p->email);
printf(" %s \t %s \t %s \t %s\n",p->name,p->adr,p->tel,p->email);
}
p->next=NULL;
}
fclose(fp1);
return(r);
}
main()/*实现创建一个新链表*/
{
NODE *p,*q,*r,*s;
char name[10];
N=0;
printf("please enter the name(if you want exit,please enter 0)(<=10):");
scanf("%s",name);
while(strcmp(name,"0")!=0)
{
N++;
p=(NODE *)malloc(LENGTH);
strcpy(p->name,name);
printf("please enter his address(<=20):");
scanf("%s",p->adr);
printf("please enter his tel(<=13):");
scanf("%s",p->tel);
printf("please enter his email(<=20):");
scanf("%s",p->email);
if(N=1) r=p;
else q->next=p;
q=p;
printf("please enter the name(if you want exit,please enter 0)(<=10):");
scanf("%s",name);
}
p->next=NULL;
display(r);
save(r);
s=load();
display(s);
getch();
}
Top
8 楼chenzhuo(睡到自然醒)回复于 2003-12-02 21:07:34 得分 0
你把文件的所有记录删除掉先!Top
9 楼antijpn(antijpn)回复于 2003-12-02 21:15:20 得分 0
好像根本就没有能成功的写入文件,至少我在VC++7.1下面编译之后不能写文件Top
10 楼zhangfjj(小张)回复于 2003-12-02 21:20:08 得分 0
display(r);//是在这个地方显示乱码?
save(r);
s=load();
display(s);//还是这个地方显示乱码?还是两处都显示乱码?再输入的是不是全英文?
getch();
Top
11 楼antijpn(antijpn)回复于 2003-12-02 21:24:36 得分 0
里面还有不少问题,例如只有malloc,没有free
还有fprintf("%s%s%s%s"会把你的内容胡子连着眉毛保存在一起,读出来肯定是不对的
暂且我也只能找到这么多,没仔细调,有空的话等会儿帮你调一下试试看Top
12 楼phoenixli(feitian)回复于 2003-12-02 21:53:05 得分 0
同意zhangfjj的话,我在VC6。0下编译跟踪,在save()里的fopen(),并没有写入文件。文件不存在。Top
13 楼chenzhuo(睡到自然醒)回复于 2003-12-02 21:59:45 得分 0
fprintf("%S%s%s%...........)这里改为fwrite(p,LENGTh,1,fp);试试!!!Top
14 楼antijpn(antijpn)回复于 2003-12-02 22:09:59 得分 0
主要是p->next!=NULL一句有问题,我也懒得查了,连个注释都没有,main()里面放了那么一堆的NODE*,也不知道干什么用的,去掉几个没用的再说!简直就是浪费内存!
上面的方法我已经用过了,我现在的代码可以保存文件了,但是还是有错,贴给你看一下好了
#include "stdafx.h"
#include <stdio.h>
#include <malloc.h>
//#define LENGTH sizeof(struct node)
struct node
{
char name[10];
char adr[20];
char tel[13];
char email[20];
struct node *next;
};
typedef struct node NODE;
int LENGTH=sizeof(struct node);
int N;
save(NODE *head)
{
char name[10];
NODE *p,*q;
FILE *fp;
p=q=head;
printf("please enter the name you want to save:\n");
scanf("%s",&name);
fp=fopen(name,"wb");
while(p!=NULL)
{
fwrite(p,LENGTH,1,fp);
p=q->next;
q=p;
if(p->next==NULL)
break;
}
fclose(fp);
}
void display(NODE *head)
{
NODE *p ;
p=head;
printf("\n\n******name*************address************telephone*********email*************\n");
while(p!=NULL)
{
printf(" %s %s %s %s\n",p->name,p->adr,p->tel,p->email);
p=p->next ;
}
}
NODE *load()
{
char name[10];
NODE *p,*q,*r;
FILE *fp1;
p=q=r=(NODE *)malloc(LENGTH);
N=0;
printf("\n please enter the file name you want to open:");
scanf("%s",name);
fp1=fopen(name,"rb");
if(fp1==NULL)
{
printf("\nthe file doesn't exist!");
exit(0);
}
else
{
while(!feof(fp1))
{
N++;
if(N!=1)
{
p=(NODE *)malloc(LENGTH);
p=q->next;
q=p;
}
fread(p,LENGTH,1,fp1);
printf(" %s \t %s \t %s \t %s\n",p->name,p->adr,p->tel,p->email);
}
p->next=NULL;
}
fclose(fp1);
return(r);
}
main()/*实现创建一个新链表*/
{
// int LENGTH=sizeof(struct node);
NODE *p,*q,*r,*s;
char name[10];
N=0;
printf("please enter the name(if you want exit,please enter 0)(<=10):");
scanf("%s",name);
while(strcmp(name,"0")!=0)
{
N++;
p=(NODE *)malloc(LENGTH);
strcpy(p->name,name);
printf("please enter his address(<=20):");
scanf("%s",p->adr);
printf("please enter his tel(<=13):");
scanf("%s",p->tel);
printf("please enter his email(<=20):");
scanf("%s",p->email);
if(N=1)
r=p;
else
q->next=p;
q=p;
printf("please enter the name(if you want exit,please enter 0)(<=10):");
scanf("%s",name);
}
p->next=NULL;
display(r);
save(r);
s=load();
display(s);
system("pause");
// getch();
}
反正你代码里面的那一堆NODE*真是看了就不爽,你自己看着解决好了。
我跟踪到save()函数的时候,在while的循环里面有问题。Top
15 楼zhangfjj(小张)回复于 2003-12-06 23:33:38 得分 0
几天来在这里花了不少时间帮助解决了若干个关于文件操作的问题,有些收获,对于你的程序也是一样的,我没有看你关于链表的操作,只是对你文件操作提出几点意见,可能会对你有帮助,你重新把代码写一遍,我敢保证不再会出现问题了。
1)注意文件打开方式,指文本方式和二进制方式,fgetc()fputc()fscanf()fprintf()fgets()fputs()支持文本方式,fread()和fwrite()支持二进制方式。
2)在你的每一个函数中,先打开文件,操作完毕后,再关闭文件,即将文件的打开与关闭“封装”在函数中,呵呵,^_^ ,借用C++的一个词,这样你在写函数时不用关心文件的状态,只要专注于函数的其他方面了。
Top
16 楼zhangfjj(小张)回复于 2003-12-06 23:40:51 得分 10
3)注意函数名的取名,我碰到过一次,他给他的函数叫read(),结果花了我一下午带一晚上的时间,最后发现read()函数与系统低层调用read冲突,
4)在定义字符数组保存字符串时,一定要注意字符串的长度,保证字符串的'\0'能被存储在字符数组中。
你只要注意了以上四点,肯定能成功。
开始烦写文件操作的代码了,(这几天写得太多了。。。)最后祝你取得最后的胜利!!!Top
17 楼Sodier(逍遥神剑)回复于 2003-12-07 02:41:17 得分 0
下面的程序可以运行了,搂主的程序里有好多小错误,自己对照着检查吧
#include"stdio.h"
#include"malloc.h"
#include"stdlib.h"
#include"conio.h"
#include"string.h"
#define LENGTH sizeof(struct node)
struct node
{
char name[10];
char adr[20];
char tel[13];
char email[20];
struct node *next;
};
typedef struct node NODE;
int N;
void save(NODE *head)//把链表中的记录存入文件
{
char name[10];
NODE *p,*q;
FILE *fp;
p=q=head;
printf("please enter the name you want to save:\n");// 输入文件名
scanf("%s",name);
fp=fopen(name,"w");
while(p!=NULL)
{
fprintf(fp,"%11s%20s%10s%20s\n",p->name,p->adr,p->tel,p->email);
p=p->next;
}
fclose(fp);
}
void display(NODE *head)//把链表中的记录输出至标准输出设备
{
NODE *p ;
p=head;
printf("\n\n******name*************address************telephone*********email*************\n");
while(p!=NULL)
{
printf("%11s%20s%10s%20s\n",p->name,p->adr,p->tel,p->email);
p=p->next ;
}
}
NODE *load()//把文件中的记录输出至显示器
{
char name[20];
NODE *p,*r,*q;
FILE *fp1;
int i=0;
p=r=(NODE *)malloc(LENGTH);
//N=0;
printf("\n please enter the file name:");
scanf("%s",name);
fp1=fopen(name,"r");
if(fp1==NULL)
{
printf("\nthe file doesn't exist!");
exit(1);
}
else
{
while(i<N)
{
fscanf(fp1,"%s%s%s%s",p->name,p->adr,p->tel,p->email);
printf("%11s%20s%10s%20s\n",p->name,p->adr,p->tel,p->email);
i++;
q=p;
p->next=(NODE *)malloc(LENGTH);
p=p->next;
}
free(p);
q->next=NULL;
}
fclose(fp1);
return(r);
}
void main()/*实现创建一个新链表*/
{
NODE *p,*q,*r,*s;
char name[10];
N=0;
printf("please enter the name(if you want exit,please enter 'n')(<=10):");
scanf("%s",name);
if(strcmp(name,"0")!=0)
{
p=(NODE *)malloc(LENGTH);
while(strcmp(name,"0")!=0)
{
N++;
//p=(NODE *)malloc(LENGTH);
strcpy(p->name,name);
printf("please enter his address(<=20):");
scanf("%s",p->adr);
printf("please enter his tel(<=13):");
scanf("%s",p->tel);
printf("please enter his email(<=20):");
scanf("%s",p->email);
if(N==1) r=p;
q=p;
p=(NODE *)malloc(LENGTH);
q->next=p;
p->next=NULL;
printf("please enter the name(if you want exit,please enter 0)(<=10):");
scanf("%s",name);
}
q->next=NULL;
free(p);
display(r);//把输入的内容显示出来
save(r);
s=load();//打开原来的文件
display(s);//显示打开的内容
//getch();//由于我的系统是xp就加了个这个
}
}
Top




