| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 734 人关注过本帖
标题:[求组]C++文件编译读写问题
只看楼主 加入收藏
末明黑夜
Rank: 1
等 级:新手上路
帖 子:12
专家分:5
注 册:2013-6-13
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
[求组]C++文件编译读写问题
程序代码:

#include "stdafx.h"
#include "stdio.h"
#include<iostream>
using namespace std;
#define SIZE 4
typedef struct student_type
{
  char name[10];
  int num;
  int age;
  char addr[15];
  struct student_type *next;
  }STUD;
STUD *indata (STUD *,STUD *head);
void savef(STUD *,STUD *head);
void loadf(STUD *,STUD *head);
void display(STUD *,STUD *head);
int main(int argc, char* argv[])
{   STUD *st,*so,*head;
    head=st=so=(STUD *)malloc(4*sizeof(STUD));
    indata(st,head);
    savef(st,head);
    loadf(so,head);
    display(so,head);
    return 0;
}
STUD *indata(STUD *s,STUD *head)
{short i;
STUD *snext;

cout<<"Input name num age addr for 4 students"<<endl;
scanf("%s %d %d %s",head->name,&head->num,&head->age,head->addr);

for(i=1;i<SIZE;i++)
{    snext=(STUD *)malloc(sizeof(STUD));
    scanf("%s %d %d %s",snext->name,&snext->num,&snext->age,snext->addr);
    s->next=snext;
    s=snext;
}
s->next=NULL;
return head;
}
void savef(STUD *s,STUD *head)
{
FILE *fp;
if((fp=fopen("d://stu.txt","wb"))==NULL)
   {cout<<"erro"<<endl;
    return;
   }
for(s=head;s->next!=NULL;s=s->next)
   {fwrite(s,sizeof(STUD),1,fp);
    
   }
fclose(fp);   
}
void loadf(STUD *s,STUD *head)
{
FILE *fp;
if((fp=fopen("d://stu.txt","rb"))==NULL)
   {fprintf(stdin,"cannot open file\n");
    return;
   }
for(s=head;s->next!=NULL;s=s->next)
    fread(s,sizeof(STUD),1,fp);
fclose(fp);
}
void display(STUD *s,STUD *head)
   {
      
       cout<<"Output..."<<endl;
       for(s=head;s->next!=NULL;s=s->next)
       {
           cout<<s->addr<<"  "<<s->num<<"  "<<s->age<<"  "<<s->name<<"  "<<endl;
       }
       
    }

程序输出然后在D://stu中显示的是乱码。。。这是为什么啊?我是在一本书上看见的,书上用的是数组,然后我想改成动态的指针来进行操作,然后就出现这样的问题了。小白求指点!
搜索更多相关主题的帖子: color 
2013-06-13 22:42
veketdelphi
Rank: 5Rank: 5
等 级:职业侠客
帖 子:67
专家分:374
注 册:2013-4-8
收藏
得分:5 
d:\\
斜杠用错了
2013-06-13 22:45
末明黑夜
Rank: 1
等 级:新手上路
帖 子:12
专家分:5
注 册:2013-6-13
收藏
得分:0 
回复 2楼 veketdelphi
额。。。可是我修改以后还是不行啊
输出还是乱码。。。。
2013-06-13 23:25
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:15 
出现乱码的原因:
1.像 STUD::name 大小有 10 byte。如果输入了 ab 那么写文件的时候,除了写入ab,剩下的字节内容也会一起被写进文件。
2.然后还有字节对齐的原因,成员数据之间还会有编译器填充进去的字节在里面(调用sizeof(STUD)查看大小)。你调用fwrite(s,sizeof(STUD),1,fp); 自然会向文件写入奇怪的数据。

如果不阅读 stu.txt 乱不乱码对你的程序没影响。
乱码修改建议:
使用C++的文件流(fstream)。每一个STUD对象写一行,用某个符号(建议空格)分割每一行中的每一个元素。

其他错误:
for(s=head;s->next!=NULL;s=s->next)
改为
for(s=head;s!=NULL;s=s->next)

迭代的是人,递归的是神。
2013-06-14 08:36
精朗
Rank: 1
来 自:广东
等 级:新手上路
帖 子:2
专家分:0
注 册:2013-6-14
收藏
得分:0 
回复 楼主 末明黑夜
专业人士的平台
2013-06-14 08:58
末明黑夜
Rank: 1
等 级:新手上路
帖 子:12
专家分:5
注 册:2013-6-13
收藏
得分:0 
回复 4楼 lintaoyn
谢谢啦!
我再去修改一下,看能不能成功
2013-06-14 19:15
末明黑夜
Rank: 1
等 级:新手上路
帖 子:12
专家分:5
注 册:2013-6-13
收藏
得分:0 
回复 4楼 lintaoyn
还是不行啊···我把name还有addr都申明成了STRING结果出来这东西
图片附件: 游客没有浏览图片的权限,请 登录注册

读写数据块.exe中的0x0fabdd6f(msvcr100d.dll)处有未经处理的异常:0xC0000005:写入位置0xcdcdcdcd时发生访问冲突
这是不是指针什么的问题啊?
2013-06-14 21:03
lintaoyn
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:小飞侠
威 望:4
帖 子:606
专家分:2499
注 册:2009-4-8
收藏
得分:0 
程序代码:
#include "stdio.h"
#include <iostream>
#include <fstream>
using namespace std;
#define SIZE 4
typedef struct student_type
{
    char name[10];
    int num;
    int age;
    char addr[15];
    struct student_type *next;
}STUD;
STUD *indata (STUD *,STUD *head);
void savef(STUD *,STUD *head);
void loadf(STUD *,STUD *head);
void display(STUD *,STUD *head);
int main(int argc, char* argv[])
{   
    STUD *st,*so,*head;
    cout << sizeof(STUD) << endl;
    head=st=so=(STUD *)malloc(4*sizeof(STUD));
     indata(st,head);
     savef(st,head);
    loadf(so,head);
    display(so,head);
    return 0;
}
STUD *indata(STUD *s,STUD *head)
{    
    short i;
    STUD *snext;

    cout<<"Input name num age addr for 4 students"<<endl;
    scanf("%s %d %d %s",head->name,&head->num,&head->age,head->addr);

    for(i=1;i<SIZE;i++)
    {    
        snext=(STUD *)malloc(sizeof(STUD));
        scanf("%s %d %d %s",snext->name,&snext->num,&snext->age,snext->addr);
        s->next=snext;
        s=snext;
    }
    s->next=NULL;
    return head;
}
void savef(STUD *s,STUD *head)
{
    ofstream ofs;
    ofs.open("d://stu.txt", ios::out|ios::binary);
    if(!ofs){
        cout << "erro" << endl;
        return;
    }
    for(s=head;s!=NULL;s=s->next){
        ofs << s->name << ' ' 
            << s->num  << ' '
            << s->age  << ' '
            << s->addr << '\n';
    }
    ofs.close();
    return; 
}
void loadf(STUD *s,STUD *head)
{
    ifstream ifs;
    ifs.open("d://stu.txt", ios::in|ios::binary);
    if(!ifs){
        cout << "erro" << endl;
        return;
    }
    for(s=head;s!=NULL;s=s->next){
        ifs >> s->name
            >> s->num
            >> s->age
            >> s->addr;
    }
    ifs.close();
    return;
}
void display(STUD *s,STUD *head)
{
    
    cout<<"Output..."<<endl;
    for(s=head;s!=NULL;s=s->next)
    {
        cout<<s->addr<<"  "<<s->num<<"  "<<s->age<<"  "<<s->name<<"  "<<endl;
    }
    
}

迭代的是人,递归的是神。
2013-06-14 21:15
末明黑夜
Rank: 1
等 级:新手上路
帖 子:12
专家分:5
注 册:2013-6-13
收藏
得分:0 
回复 8楼 lintaoyn
呵呵,谢谢啦!我一开始以为是要用string代替char定义name和addr,然后就出现这个问题了。。。。
2013-06-14 22:10
q215236213
Rank: 4
等 级:业余侠客
威 望:1
帖 子:148
专家分:276
注 册:2012-7-24
收藏
得分:0 
结构体类型 需要格式化之后再保存,否则就是乱码!
结构体直接保存默认是二进制形式的!所以需要格式化之后在保存
2013-06-16 22:28
快速回复:[求组]C++文件编译读写问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.014553 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved