powerwind 发表于 2006-5-2 23:55

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

毕业设计互选系统

要求:

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。
*/

#include<iostream>
using namespace std;
int main()
{
    char str[]="日期:2006-5-1,天气:晴,标题:今天是五一";
    const char *delimiter=",";
    char* temp;
    temp=strtok(str,delimiter);
    while (temp!=NULL)
    {
          cout<<temp<<endl;
          temp=strtok(NULL,delimiter);
    }
}

按理说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;
    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;
}

写文件

#include<fstream>
#include<iostream>
#include<string>
using namespace std;

int main()
{
    char buffer[]="从数组写入一行";
    const string filename("test.txt");
    fstream out(filename.c_str(),ios::out);
    if(!out)
    {
            cout<<"error"<<endl;
            exit(1);
    }
    out<<"用<<写入的一行"<<endl;
    out.write(buffer,strlen(buffer));
}

文件读写操作在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;

   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 编辑 ]

Leon001 发表于 2006-5-3 01:11

已阅……

wool王 发表于 2006-5-7 20:12

楼上的最近经常路过这里...

powerwind 发表于 2006-5-7 22:24

楼上一出现就把全部帖顶一下来过隐,是不是?
呵呵~~

Leon001 发表于 2006-5-7 22:50

因为最近就做这些,初学者要看下。别人的结论可能是多次试验和经验的总结,对提高比较有帮助

wool王 发表于 2006-5-8 01:46

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

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

梁天下 发表于 2006-6-7 23:40

Sample TextSample Text:kiss::kiss::kiss:一般而已

powerwind 发表于 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={1,2,3,4,5,6,7,8,9,10}; //假设学号为1-10        
                     int courseID={0}; //课程号
        int a={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=a=temp;
                                break;
                        }
                }
        }

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

        system("pause");
        return 0;
}


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

iptton 发表于 2006-12-8 15:05

快到课设时间了,顶上来...

言而有迅 发表于 2006-12-17 09:44

好复杂哦。。。我系初学者。。努力先得。。

siren 发表于 2006-12-22 22:39

受教了,这次C++实验现学现用了文件操作那几个函数
以后要多来这个版淘点宝
页: [1]
查看完整版本: C/C++课程设计之文件操作