首页 > 代码库 > 关于Linux文件操作1.1

关于Linux文件操作1.1

本文章记录本人在学习Linux中遇到的一些比较好的题目,给大家分享一下.          

            先来实验题目:

编程实现一个程序,功能是每一秒钟向屏幕打印当前系统时间,和当前行号示例如下

        技术分享

 

该程序应该无限循环,直到强制中断该进程为止(比如按Ctrl-C中断程序)。接着再启动程序将系统时间追加到原文件之后,并且序号能够接续上次的序号:

技术分享

 

    好了看完题目后我们应该想的是,实现这么一个功能我们需要什么知识? 我们实现功能的逻辑是什么? 我们在写代码中有什么细节需要注意的(PS:使代码尽善尽美!)

a):  先花五分钟想一下这个东西是什么鬼

b):  再花十分钟想一下我们用什么逻辑来实现

c):   再用十分钟啪啪啪地写完代码 `0_0`....

d):   最后花点时间看下代码有什么需要改进的(当然这个代码比较简单,在调用标准io函数时注意下出错判断就okay..    当然这需要在Linux终端下man一下帮助文档)

 

================用到的工具 ubantu虚拟机---gcc编译器=====================

 

 

===============================================================================================

                       好吧,什么也不说。代码贴上

 1 #include <time.h>
 2 #include <stdlib.h>
 3 #include <stdio.h>
 4 #include <string.h>
 5 
 6 int main(void)
 7 {
 8     FILE *fp = fopen("test.txt", "a+"); // 以追加模式打开,没有就自动创建,可读可写。
 9 
10     char msg[50];
11     int line = 0;
12     while(1)
13     {
14         if(fgets(msg, 50, fp) == NULL)  // 用一种投机方式算出当前文件有多少行
15             break;
16         line++;
17     }
18     printf("line: %d\n", line);
19 
20     time_t t;
21     while(1)
22     {
23         // 返回当前系统时间(从1970.01.01晚上0点到现在的秒数)
24         time(&t);  
25         line++;
26 
27         char *now = ctime(&t);     //转化格式
28         printf("%d. %s", line, now);
29 
30         snprintf(msg, 50, "%d. %s", line, now);  //存到内存msg
31         fputs(msg, fp);
32         fflush(fp);     //强制刷新到内存
33 
34         sleep(1);
35     }
36 
37     return 0;
38 }

什么代码很简单?        

我说:“是的.............”

 

我们先说第一个问题:

  a):是什么鬼..

  这是向屏幕持续打印当前系统时间、显示当前行、利用文件存储相关信息用于下次程序读写的一个程序

这需要用到Linux文件操作知识: 由这个知识又引申出两大知识 1.打开关闭文件、读取文件相关信息    2.文件缓冲区类型

如果这些不懂的出门左转那里有个百度,看到没 0_0-....

 

再说第二个问题 

=============考虑刚进来的情况....======================

  :b)用什么逻辑实现

  1.首先我们需要一个文件,这个文件以什么方式打开呢?。。。。 通过查看man手册我们知道用 a+ 模式是最好的(请看注释)

  2.我们定义变量把行号、时间打印出来就好了.

  3.我们用一个普通txt文件存放当前系统时间、行号这个字符串,用snprintf 函数实现字符串拷贝内存,每次存放50个字节(因为每一行数据少于50个字节),

然后用fgets函数将内存msg 里面的数据拷贝到文件里面来.

  3.由于普通文件是全缓冲所以在当前程序没有正常退出时这文件是不会被刷新到内核的!所以我们就在snprintf 函数后面加上一句fflush强制刷新到内核

================不小心被ctrl + C 掉=============================

  4.我们需要通过之前存下信息的文件里找到当前行号(时间的话系统帮我们自动生成),我们可以用一种比较投机的方法:

因为我们之前是50个字节一行一行地存放到文件的,所以我们可以50个字节一行一行的读出来,每读一行行号加一,这样就可以得到当前行号了(用时还需自加一...)

 

 

再说第三个问题

  :c)写代码.. 0_0^...

 

最后

  :d)这个程序有什么需要改进的呢?

  1.打开一个文件,一般来说是可以顺利打开的,但是也有可能打不开,这是我们需要判断 

1 if(fp == NULL)  
2 {      //需要相关头文件
3     printf(" %s open failed  %s", "test.txt", strerror(errno));
4     exit(0);
5 }
free(fp)
;

  2.因为栈的空间有限,所以我们一般用到比较大的内存时改用堆内存

  

char *buf  =  cmalloc(1,50);
用完也需要free(msg);

 

  ===========================总结啦================================

这个功能其实很简单,实现也不复杂,其实也就是用到了文件的写和读.

 

在下一个文章《关于Linux文件操作1.2》中有对这个题目的另解.

 

关于Linux文件操作1.1