工大后院

 找回密码
 加入后院

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
查看: 3834|回复: 10

C/C++课程设计之文件操作

[复制链接]
发表于 2006-5-2 23:55 | 显示全部楼层 |阅读模式
毕业设计互选系统

要求:
1,系统为教师、学生、管理人员分别提供操作界面,三部分分别由不同的同学完成。
2,能登记保存教师信息、学生信息,将信息存入文件。
教师信息包括教师工号、姓名、年龄、职称、所在系、联系电话。学生信息包括学号、姓名、所在系、宿舍、联系电话。
3,能为教师登记毕设课题信息,将课题存入文件。课题信息包括课题编号、课题名、主持老师、面向系、课题内容、课题要求。

4,能为学生查看毕设课题资料。
5,能为学生填写毕设志愿,每个学生可以填写三个课题志愿。学生填写志愿必须跟课题面向系匹配。如果学生没有确定毕设题目,则可以任意修改志愿。课题没有确定选题同学则可以被够资格的同学申请。

6,填写完志愿后,能为教师筛选志愿,确定每个课题选题同学,每个课题只能由一个学生选题。
7,教师筛选志愿完成后,将没有选定毕设课题的同学和没有被选的课题进行随机分配,直到每个学生分配到课题为止。
8,提供每个同学选题统计的报表。
9,其它使系统更完善的功能。

一,要注意的问题

在本版的原创帖集合中,可以找到hjack的<<C/C++常见问题>>。在此就再简单提几点吧。

1,文件包含
调用C++的旧类厍,include的文件有.h的后缀,新的则没有。
旧的:
#include<iostream.h>

新的:
#include<iostream>
using namespace std;

因为新的东西都放在std这个名字空间了。

2,字符串
字符串是以'\0'结束
如char str[]="hello";实际上是“hello\0”
C++的string类这样用 string str="hello";实际上也是“hello\0”
str.c_str()返回指向str字符串的const(常量)指针

3,数组与指针
很多时候数组和指针可以同等对待,一般使用不会出现问题。但是千万不要直接使用没有指向指定内存的指针。简单地说,用指针前,它一定指向某数组、变量或用new分配的空间。


二,字符串分解

这里介绍一个函数。
/*
原型:char *strtok(char *s, char *delim);
  
  功能:分解字符串为一组标记串。s为要分解的字符串,delim为分隔符字符串。
  
  说明:首次调用时,s必须指向要分解的字符串,随后调用要把s设成NULL。
        strtok在s中查找包含在delim中的字符并用NULL('\0')来替换,
        直到找遍整个字符串。返回指向下一个标记串。
        当没有标记串时则返回空字符NULL。
*/

  1. #include<iostream>
  2. using namespace std;
  3. int main()
  4. {
  5.     char str[]="日期:2006-5-1,天气:晴,标题:今天是五一";
  6.     const char *delimiter=",";
  7.     char* temp;
  8.     temp=strtok(str,delimiter);
  9.     while (temp!=NULL)
  10.     {
  11.           cout<<temp<<endl;
  12.           temp=strtok(NULL,delimiter);
  13.     }
  14. }
复制代码

按理说strtok应该在string或string.h这个头文件里的,可是我没写#include<string>这句也通过了编译。
http://www.cplusplus.com/ref/cstring/strtok.html有较详细介绍(虽然是英文的,也不难看懂)。

三,读写文件(C++)

先看代码
#include<fstream>
#include<iostream>
using namespace std;
//读文本文件,getline比较好用
//file:read.cpp

int main()
{
    char buffer[257];
    fstream in("read.cpp",ios::in); //或者ifstream in("read.cpp");
    if(in.is_open())
    {
    while(in.getline(buffer,256))//buffer指读入到的缓存,256指要读入的大小,如果小于指定大小,会写入'\0'
             cout<<buffer<<endl;
    in.close();//用完了关闭是好习惯
    }
    else
    cout<<"无法打开文件"<<endl;

    return 0;
}

写文件

  1. #include<fstream>
  2. #include<iostream>
  3. #include<string>
  4. using namespace std;

  5. int main()
  6. {
  7.     char buffer[]="从数组写入一行";
  8.     const string filename("test.txt");
  9.     fstream out(filename.c_str(),ios::out);
  10.     if(!out)
  11.     {
  12.             cout<<"error"<<endl;
  13.             exit(1);
  14.     }
  15.     out<<"用<<写入的一行"<<endl;
  16.     out.write(buffer,strlen(buffer));
  17. }
复制代码

文件读写操作在http://www.cplusplus.com/doc/tutorial/files.html 也有详细介绍。

读写文件(C)

读文件

/*
**函数名: fgets
**功  能: 从流中读取一字符串
**用  法: char *fgets(char *string, int n, FILE *stream);
**程序例:
*/

//file:readline.c

#include <string.h>
#include <stdio.h>

int main(void)
{
   FILE *stream;
   char msg[256];

   stream = fopen("readline.c", "r");
   while(fgets(msg, 256, stream)!=NULL)  
   printf("%s", msg);

   fclose(stream);
   return 0;
}


写文件

/*
*函数名: fwrite
*功  能: 整块数据的读写函数(可以写入一个结构体)
*用  法: int fwrite(void *ptr, int size, int nitems, FILE *stream);
*size是指输入块的大小(单位:字节),如字符为1,nitems指块数
*/

#include <string.h>
#include <stdio.h>

int main(void)
{
   FILE *stream;
   unsigned char msg[] = "This is a test\n";
   unsigned char msg2[]="This is line 2\n";

   stream = fopen("test.txt", "w+");
   fwrite(msg,1,strlen(msg),stream);
   fwrite(msg2,1,strlen(msg2),stream);

   fclose(stream);
   return 0;
}

当然,你还可以用fgetc,fgets,fputc,fputs等来操作文件
更详细介绍在http://www.cplusplus.com/ref/cstdio/

四,继承、多态(C++)
以前大一学的是C语言,现在老师建议用C++来实现。有些同学才开始接触C++,难免以为C++只是比C多了个类而已,然后自然想到定义Student类、Teacher类,在类里写一些函数操作。当然,方法多种多样。这里有个想法:使用C++的继承、多态。具体如何,各人有不同实现方法。我只给个最简单的例子说明C++的继承、多态。
#include<iostream>
using namespace std;

class Person
{
      public:
            virtual void print()=0;
};

class Student:public Person
{
      public:
            void print()
            {
                   cout<<"print from Student"<<endl;
            }
};

class Teacher:public Person
{
      public:
             void print()
             {
                    cout<<"print from Teacher"<<endl;
             }
};

void f(Person*p)
{
     p->print();
}
int main()
{
    Student s;
    Teacher t;
    f(&s);
    f(&t);
    //system("pause");
    return 0;
}
/*
**把Person类的函数定义纯虚函数(相当JAVA的接口),然后Student类和Teacher类分别继承Person。
**void f(Person*p);可以接受Person子类指针,根据不同子类调用不同的print()函数。
*/

很多东西要我们自己慢慢尝试、探索、实现。
有不当或错误之处,请批评指正,谢谢!

[ 本帖最后由 powerwind 于 2006-6-28 00:55 编辑 ]

评分

2

查看全部评分

发表于 2006-5-3 01:11 | 显示全部楼层
已阅……
回复

使用道具 举报

发表于 2006-5-7 20:12 | 显示全部楼层
楼上的最近经常路过这里...
回复

使用道具 举报

 楼主| 发表于 2006-5-7 22:24 | 显示全部楼层
楼上一出现就把全部帖顶一下来过隐,是不是?
呵呵~~
回复

使用道具 举报

发表于 2006-5-7 22:50 | 显示全部楼层
因为最近就做这些,初学者要看下。别人的结论可能是多次试验和经验的总结,对提高比较有帮助
回复

使用道具 举报

发表于 2006-5-8 01:46 | 显示全部楼层
原帖由 powerwind 于 2006/5/7 14:24 发表
楼上一出现就把全部帖顶一下来过隐,是不是?
呵呵~~


休息了一个星期没上来,很多新贴我都没看啊,,,看完就顺手回了啊...
回复

使用道具 举报

发表于 2006-6-7 23:40 | 显示全部楼层
Sample TextSample Text:kiss::kiss::kiss:一般而已
回复

使用道具 举报

 楼主| 发表于 2006-7-1 20:31 | 显示全部楼层

补充随机分配的一点方法

做这个课程设计的最后一个难点是随机分配课题。有人做到这个地方就停下来。这里假设一种很简单的情况来举个例子。

学生和课题都包含很多信息,这里只取它们的编号来实现随机分配。具体情况可作相应更改。

/*****************************************************************
*
*   filename:Test.c  
*
*   Author: powerwind 2006/7/1
*
*******************************************************************/


#include<stdlib.h>


/*================================================================
*
* 函 数 名:char contain(int*p,int x,int index)
*
* 参    数:
*
*        p 是数组指针,x 是要查的值,index 是数组最大下标
*
* 功能描述:
*
*          查找数组中是否包含指定元素   
*
* 返 回 值:有则返回 1,无则返回 0
*
* 作    者:powerwind 2006/7/1
*
================================================================*/

char contain(int*p,int x,int index)
{
        for(;index>=0;index--)
                if(*(p+index)==x)return 1;
        return 0;
}

/*==============================================================
*
* int main() 假设学号为1-10,课程号也为1-10
*
/*==============================================================*/

int main()
{
        int studentID[10]={1,2,3,4,5,6,7,8,9,10}; //假设学号为1-10        
                     int courseID[10]={0}; //课程号
        int a[10]={0};
        int j,temp;

        srand(time(NULL));  //用系统时间做随机种子
        for (j=0; j<10; j++)
        {
                while (1)
                {
                        temp=rand()%10; //0-9的随机数字
                        temp++;   //则temp为1-10
                        if (!contain(a,temp,j))  //如果该数出现过,则循环
                        {
                                courseID[j]=a[j]=temp;
                                break;
                        }
                }
        }

        for(j=0;j<10;j++)
                printf("%2d->%2d\n",studentID[j],courseID[j]);

        system("pause");
        return 0;
}

[ 本帖最后由 powerwind 于 2006-7-1 20:36 编辑 ]
回复

使用道具 举报

发表于 2006-12-8 15:05 | 显示全部楼层
快到课设时间了,顶上来...
回复

使用道具 举报

发表于 2006-12-17 09:44 | 显示全部楼层
好复杂哦。。。我系初学者。。努力先得。。
回复

使用道具 举报

发表于 2006-12-22 22:39 | 显示全部楼层
受教了,这次C++实验现学现用了文件操作那几个函数
以后要多来这个版淘点宝
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入后院

本版积分规则

QQ|Archiver|手机版|小黑屋|广告业务Q|工大后院 ( 粤ICP备10013660号 )

GMT+8, 2025-5-16 00:15

Powered by Discuz! X3.5

Copyright © 2001-2024 Tencent Cloud.

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