鱼C论坛

 找回密码
 立即注册
查看: 1913|回复: 4

[已解决]用C语言写的学生管理系统怎样存到文本中,从文本中再读取出来

[复制链接]
发表于 2018-6-20 08:33:25 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 DYC 于 2018-6-20 08:39 编辑

把各个链表中的数据分别存到记事本中,也可以从记事本中读取数据。
代码在附件中,求各位大神帮帮我。
最佳答案
2018-6-20 14:09:14
本帖最后由 关键是感觉 于 2018-6-20 14:13 编辑
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

typedef struct sTest{
        int Data;                                                                        //这里为了演示简单,直接创建了int类型变量作为数据域,其实最好到方法是创建一个结构体数据域
        struct sTest * next;
}sTest;
typedef struct sHead{                                                        //根据大佬讲解,这样比较方便管理链表,比书中讲解的直接在全局创建比较好
        sTest * p_head;
        //好处可以记录链表状态,比如最后结点位置,最大值,最小值,你能想到的任何东西
        //sTest * p_tail;
        //int max;
        //int min
}sHead;

sHead * inital(){
        sHead * t= (sHead * )malloc(sizeof(sHead));
        if(!t) exit(-1);                                                        //创建失败直接退出
        t->p_head=NULL;                                                                //初始化
        return t;                                                                        //返回指针
}
void add(sHead * p,int n){
        sTest *swap=(sTest * )malloc(sizeof(sTest));//因为是头部插入,所以最后申请到空间永远在头部
        swap->Data=n;
        swap->next=p->p_head;                                                //头部插入
        p->p_head=swap;                                
}
void save(sHead * p){
        sTest *t=p->p_head;
        FILE * pf = fopen("d.data","wb");
        if(pf){
                while(t){
                        fwrite(&t->Data,sizeof(t->Data),1,pf);
                        t= t->next;
                }
                fclose(pf);
        }
}

void read(sHead * p){
        FILE * pf = fopen("d.data","rb");
        if(pf){
                int Data;
                int h;
                while(h = fread(&Data,sizeof(Data),1,pf)){
                        add(p,Data);
                }
                fclose(pf);
        }
}


/*
上面都是链表知识,
文件读取和保存,
文件操作,先来一个死记硬背的理解,
r        打开一个已有的文本文件,允许读取文件。
w        打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a        打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+        打开一个文本文件,允许读写文件。
w+        打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+        打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。
如果处理的是二进制文件可以在模式后面添加b
文字那么多其实就三个字母:r w a
r就是可以读文件,不存在就读取失败
w写文件,不存在创建文件,存在文件,覆盖文件
a如果在一个文件追加内容,w肯定不行,r是读,所以有了a模式,不存在创建,存在追加信息
+其实就是rwa的加强版,让r可读可写,r+ w+ a+ 类型
b其实以什么方法操作文件 二进制
t其实以什么方法操作文件 文本模式
网上收集:b是二进制模式,是一种通用的文件读取模式,因为所有的文件在硬盘中都是以二进制形式存放的 *** 就是通用的

二进制 I/O 函数
下面两个函数用于二进制输入和输出:  二进制模式操作
size_t fread(void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);  
size_t fwrite(const void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);
*/
void print(sHead * p){
        sTest *t=p->p_head;
        while(t){
                printf("%d\t",t->Data);
                t= t->next;
        }
}
void _ferr(sHead * p){
        sTest *t=p->p_head;
        while(t){
                sTest *t_free = t;
                t =t->next;
                free(t_free);
        }
}

int main(int argc, char *argv[]){
        sHead * head;
        int i;
        head = inital();
        
        read(head);
        for(i=0;i<10;i++){
                add(head,i);
        }
        print(head);
        save(head);
        _ferr(head);
        free(head);
        //停下手上的测试帮楼主。。。
        return 0;
}

代码没有几行,就是注释比较多

代码.txt

50.95 KB, 下载次数: 7

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-6-20 14:09:14 | 显示全部楼层    本楼为最佳答案   
本帖最后由 关键是感觉 于 2018-6-20 14:13 编辑
#include "stdio.h"
#include "stdlib.h"
#include "malloc.h"

typedef struct sTest{
        int Data;                                                                        //这里为了演示简单,直接创建了int类型变量作为数据域,其实最好到方法是创建一个结构体数据域
        struct sTest * next;
}sTest;
typedef struct sHead{                                                        //根据大佬讲解,这样比较方便管理链表,比书中讲解的直接在全局创建比较好
        sTest * p_head;
        //好处可以记录链表状态,比如最后结点位置,最大值,最小值,你能想到的任何东西
        //sTest * p_tail;
        //int max;
        //int min
}sHead;

sHead * inital(){
        sHead * t= (sHead * )malloc(sizeof(sHead));
        if(!t) exit(-1);                                                        //创建失败直接退出
        t->p_head=NULL;                                                                //初始化
        return t;                                                                        //返回指针
}
void add(sHead * p,int n){
        sTest *swap=(sTest * )malloc(sizeof(sTest));//因为是头部插入,所以最后申请到空间永远在头部
        swap->Data=n;
        swap->next=p->p_head;                                                //头部插入
        p->p_head=swap;                                
}
void save(sHead * p){
        sTest *t=p->p_head;
        FILE * pf = fopen("d.data","wb");
        if(pf){
                while(t){
                        fwrite(&t->Data,sizeof(t->Data),1,pf);
                        t= t->next;
                }
                fclose(pf);
        }
}

void read(sHead * p){
        FILE * pf = fopen("d.data","rb");
        if(pf){
                int Data;
                int h;
                while(h = fread(&Data,sizeof(Data),1,pf)){
                        add(p,Data);
                }
                fclose(pf);
        }
}


/*
上面都是链表知识,
文件读取和保存,
文件操作,先来一个死记硬背的理解,
r        打开一个已有的文本文件,允许读取文件。
w        打开一个文本文件,允许写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会从文件的开头写入内容。如果文件存在,则该会被截断为零长度,重新写入。
a        打开一个文本文件,以追加模式写入文件。如果文件不存在,则会创建一个新文件。在这里,您的程序会在已有的文件内容中追加内容。
r+        打开一个文本文件,允许读写文件。
w+        打开一个文本文件,允许读写文件。如果文件已存在,则文件会被截断为零长度,如果文件不存在,则会创建一个新文件。
a+        打开一个文本文件,允许读写文件。如果文件不存在,则会创建一个新文件。读取会从文件的开头开始,写入则只能是追加模式。
如果处理的是二进制文件可以在模式后面添加b
文字那么多其实就三个字母:r w a
r就是可以读文件,不存在就读取失败
w写文件,不存在创建文件,存在文件,覆盖文件
a如果在一个文件追加内容,w肯定不行,r是读,所以有了a模式,不存在创建,存在追加信息
+其实就是rwa的加强版,让r可读可写,r+ w+ a+ 类型
b其实以什么方法操作文件 二进制
t其实以什么方法操作文件 文本模式
网上收集:b是二进制模式,是一种通用的文件读取模式,因为所有的文件在硬盘中都是以二进制形式存放的 *** 就是通用的

二进制 I/O 函数
下面两个函数用于二进制输入和输出:  二进制模式操作
size_t fread(void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);  
size_t fwrite(const void *ptr, size_t size_of_elements, 
             size_t number_of_elements, FILE *a_file);
*/
void print(sHead * p){
        sTest *t=p->p_head;
        while(t){
                printf("%d\t",t->Data);
                t= t->next;
        }
}
void _ferr(sHead * p){
        sTest *t=p->p_head;
        while(t){
                sTest *t_free = t;
                t =t->next;
                free(t_free);
        }
}

int main(int argc, char *argv[]){
        sHead * head;
        int i;
        head = inital();
        
        read(head);
        for(i=0;i<10;i++){
                add(head,i);
        }
        print(head);
        save(head);
        _ferr(head);
        free(head);
        //停下手上的测试帮楼主。。。
        return 0;
}

代码没有几行,就是注释比较多
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-6-20 16:04:34 | 显示全部楼层
谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-6-20 16:16:42 | 显示全部楼层
我要的是把数据存入文本中,打开 .txt 就能看见。能不能用 fprintf() 和 fscanf() 来存和读
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-6-22 16:55:57 | 显示全部楼层
void save(sHead * p){
    sTest *t=p->p_head;
    FILE * pf = fopen("d.data","w");
    if(pf){
        while(t){
                        fprintf(pf,"%d\n",t->Data);
            //fwrite(&t->Data,sizeof(t->Data),1,pf);
            t= t->next;
        }
        fclose(pf);
    }
}

void read(sHead * p){
    FILE * pf = fopen("d.data","r");
    if(pf){
        int Data;
        int h;
                        while(h=fscanf(pf,"%d",&Data)!=EOF){        
                        // while(h = fread(&Data,sizeof(Data),1,pf)){
                        add(p,Data);
                }
        fclose(pf);
    }
}
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-30 00:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表