【算法】系统和文件操作

小续

   对于数据结构和算法,都只是思想层面的东西,而在实际运用当中,多数是与系统和文件相联系的,所以对于学习数据结构与算法,可以参照操作系统中一些代码的实现,毕竟那都是经过大牛再三修改得出来的精华。

   但据我了解,很多人都一味地去“研究”算法本身去了,算法主要是用来解决问题的,当它们遇到问题时,知道怎么解决,但却不知道从哪里入手,这是很悲剧的一件事情,而实际应用中,大多数操作都和文件相当,所以我这里列了两个文件相关的实例,主要是提醒大家不要忘了学算法的目的,希望能帮助到大家




文件连接


   编程:实现将命令行中指定的第一个文本文件的内容追加到第二个文件之后。

   实例解析:

   该实例要求从命令行指定两个文件名,故需要定义带参数的main()函数。

   程序代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
#include <stdio.h>
int main(int argc, char* argv[])
{
    FILE *fp1,*fp2;
    int ch;
    if(argc != 3)
    {
        printf(“参数个数不对!”);
        exit(0);
    }
    if((fp1 = fopen(argv[1], ”r”)) == NULL)
    {
        printf(“打开文件:%s失败\n”, argv[1]);
        exit(1);
    }
    if((fp2 = fopen(argv[2], ”a”)) == NULL)
    {
        printf(“打开文件:%s失败\n”, argv[2]);
        exit(1);
    }  
    while((ch = fgetc(fp1)) != EOF)
        fputc(ch,fp2);
    fclose(fp1);
    fclose(fp2);
    return 0;
}




文件读写操作  

   文件student.dat用于存储学生信息(每人存储姓名,数学、物理、化学三科成绩,总分)。写一个函数,可由键盘输入10个学生的三科成绩并存入文件,再写一个函数,读取这些分数、计算总分并将总分写入文件。

   实例解析:

   由于每人有五项数据需要存储,所以先定义一个结构体如下:

1
2
3
4
5
6
typedef  struct
{
    char name[10];
    int score[3];
    int sum;
}STU;


   第一个函数用来写文件,需要用“wb”或“w”方式打开,第二个文件需要“读写”文件,用“rb+”或“r+”方式打开。

   两个函数的代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
void  input()
{
    FILE *fp;
    int i;
    STU s;
    if((fp = fopen(“student.dat”, “wb”)) == NULL)
    {
           printf(“打开文件失败\n”);
           exit(0);
    }
    for(i = 0; i <= 9; i++)
    {
        scanf(“%s”, s.name);
        scanf(“%d%d%d”, &s.score[0],&s.score[1],&s.score[2]);
    fwrite(&s, sizeof(STU), 1, fp);
    }
    fclose(fp);
}
void  calculate()
{
    FILE *fp;
    int i;
    STU s;
    if((fp = fopen("student.dat""r+")) == NULL)
    {
        printf("打开文件失败\n");
        exit(0);
    }
    for(i = 0; i <= 9; i++)
    {
        fseek(fp, sizeof(STU)*i, 0);
        fread(&s, sizeof(STU), 1, fp);
        s.sum = s.score[0] + s.score[1] + s.score[2];
        fseek(fp, -2, 1);
        fwrite(&s.sum, 2, 1, fp);
    }
    fclose(fp);
}




本文转自infohacker 51CTO博客,原文链接:http://blog.51cto.com/liucw/1171369



上一篇:C语言数据结构(15)--二叉树的前序、中序、后序遍历


下一篇:Linux查看和删除进程