注册 登录
编程论坛 C++教室

[求组]C++文件编译读写问题

末明黑夜 发布于 2013-06-13 22:42, 734 次点击
程序代码:


#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中显示的是乱码。。。这是为什么啊?我是在一本书上看见的,书上用的是数组,然后我想改成动态的指针来进行操作,然后就出现这样的问题了。小白求指点!
9 回复
#2
veketdelphi2013-06-13 22:45
d:\\
斜杠用错了
#3
末明黑夜2013-06-13 23:25
回复 2楼 veketdelphi
额。。。可是我修改以后还是不行啊
输出还是乱码。。。。
#4
lintaoyn2013-06-14 08:36
出现乱码的原因:
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)
#5
精朗2013-06-14 08:58
回复 楼主 末明黑夜
专业人士的平台
#6
末明黑夜2013-06-14 19:15
回复 4楼 lintaoyn
谢谢啦!
我再去修改一下,看能不能成功
#7
末明黑夜2013-06-14 21:03
回复 4楼 lintaoyn
还是不行啊···我把name还有addr都申明成了STRING结果出来这东西
只有本站会员才能查看附件,请 登录

读写数据块.exe中的0x0fabdd6f(msvcr100d.dll)处有未经处理的异常:0xC0000005:写入位置0xcdcdcdcd时发生访问冲突
这是不是指针什么的问题啊?
#8
lintaoyn2013-06-14 21:15
程序代码:
#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;
    }
   
}
#9
末明黑夜2013-06-14 22:10
回复 8楼 lintaoyn
呵呵,谢谢啦!我一开始以为是要用string代替char定义name和addr,然后就出现这个问题了。。。。
#10
q2152362132013-06-16 22:28
结构体类型 需要格式化之后再保存,否则就是乱码!
结构体直接保存默认是二进制形式的!所以需要格式化之后在保存
1