| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5165 人关注过本帖
标题:无法实现按ctrl + c 停止 ,再次运行该程序,继续之前的行号,往里面写下时 ...
只看楼主 加入收藏
Juhe
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-2-3
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:11 
无法实现按ctrl + c 停止 ,再次运行该程序,继续之前的行号,往里面写下时间
/*
1: 编写一个程序,每次运行该程序每隔1秒就往同一个文件中写入当前的时间
        要求有行号
            1  Sat Jan 30 00:33:36 PST 2016
            2  Sat Jan 30 00:33:37 PST 2016
            3  Sat Jan 30 00:33:38 PST 2016
        按ctrl + c 停止
        再次运行该程序,继续之前的行号,往里面写下时间
            4  Sat Jan 30 00:40:38 PST 2016   
            5  Sat Jan 30 00:40:39 PST 2016   

*/

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

time_t result;
char * data ;
FILE*fp;
FILE*lfp;
int count;
char buf [100];
//char lbuf [10];
int main (void)
{
   
    fp = fopen ("./a.txt","a");
    if ( fp == NULL)
    {
        perror ("fopen failed");
        return -1;
    }
   
    lfp = fopen ("./lin.txt","a+");
    if (lfp == NULL)
    {
        perror ("fopen failed");
        return -1;
    }

    lfp = freopen("./lin", "w+", lfp);
   
    //printf ("%d\n",count);
    while (1)
    {  
        //bzero (buf,100);//清空buf
        count++;
        result = time (NULL);
        data = asctime( localtime(&result));
        sprintf(buf,"%d.%s",count,data);
        fwrite (buf,strlen(buf),1,fp);//将buf里的写入fp的文件里
        fprintf(lfp, "%d\n", count);
        printf ("%s",buf);
        fseek(lfp, 0 , SEEK_SET);
        fflush (lfp);
        fflush (fp);//强退还能将buf里的存到fp的文件里
        sleep (1);
    }
   
    exit(0);
}
搜索更多相关主题的帖子: include 
2016-02-03 20:44
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你知不知道Ctrl+C是什麽性質的動作?不知道的話,直接拔電源缐就知道了。

授人以渔,不授人以鱼。
2016-02-03 20:50
Juhe
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-2-3
收藏
得分:0 
回复 2楼 TonyDeng
就是要ctrl+c强退后,再次则行要接上强退前的序号
2016-02-03 20:59
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
正常的程序,如果你不知道如何封禁Ctrl+C,最起碼不要教用戶知道存在這個按鍵組合,對一知半解的,要嚴厲恐嚇,説按了會爆炸死人。Win32 API有特殊的函數讓操作系統不處理Ctrl+C,那是操作系統接管的按鍵,就如你的程序無法阻攔Ctrl+Alt+Shift熱重啟機器一樣。

授人以渔,不授人以鱼。
2016-02-03 21:02
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:2 
以下是引用Juhe在2016-2-3 20:59:53的发言:

就是要ctrl+c强退后,再次则行要接上强退前的序号

那就必須讓操作系統放棄處理這個按鍵,把消息轉交給你的程序。這與具體環境有關。在Windows下,有API接口,在DOS下,必須搶接系統中斷。

[此贴子已经被作者于2016-2-3 21:07编辑过]


授人以渔,不授人以鱼。
2016-02-03 21:05
Juhe
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2016-2-3
收藏
得分:0 
回复 5楼 TonyDeng
其实不一定要处理ctri+c 可以把序号写入另一个文件“lin”中,在利用freopen重新指定到文件
2016-02-03 21:25
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你現在按Ctrl+C的問題是導致有數據未寫入磁盤,或寫到一半爛尾,等於文檔損壞,那是接不下去的。Ctrl+C之後,程序後面的代碼根本就無法執行,寫什麽都沒用,更要命的是,你根本就不知道程序執行到那裏被按下了Ctrl+C。reopen有什麽用?那跟直接重新啟動程序一樣,何必reopen。總之,你明白按下Ctrl+C等效於掉電就明白了,沒有絶對有效的辦法確保無誤,祇能儘量減少損失。當然,掉電是沒辦法,但對Ctrl+C,最好的處理是不觸發這個事件。你可以改用別的按鍵。

[此贴子已经被作者于2016-2-3 21:36编辑过]


授人以渔,不授人以鱼。
2016-02-03 21:31
TonyDeng
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:304
帖 子:25859
专家分:48889
注 册:2011-6-22
收藏
得分:0 
你這個像日誌一樣的東西,不知具體要幹什麽,擠一半留一半的,很難給意見。

授人以渔,不授人以鱼。
2016-02-03 22:11
菜鸟变大神
Rank: 2
等 级:论坛游民
帖 子:9
专家分:29
注 册:2014-6-23
收藏
得分:18 
可以设置一个信号!发送ctrl+c这个信号时让他进入fun  在fun里实现再次进入功能  不知道可以不!!
2016-02-03 22:58
拉链
Rank: 7Rank: 7Rank: 7
等 级:黑侠
帖 子:107
专家分:534
注 册:2016-1-22
收藏
得分:0 
ctrl+c是中断控制台的程序运行,楼主也有文件缓冲处理,这样用ctrl+c没大问题。楼主主要问题是没有读上次存储下来的序号,中间文件lin.txt估计应为lin,所以代码部分修改如下(其它不变;linux下sleep应包含unistd库,win下1秒为Sleep(1000),包含windows.h):
    fp = fopen ("./a.txt","a");
    if ( fp == NULL)
    {
        perror ("fopen failed");
        return -1;
    }
    lfp = fopen ("./lin","a");  //确保lin文件存在,否则freopen出错
    lfp = freopen("./lin", "r",stdin);
    if(lfp!=NULL)scanf("%d",&count);
    lfp = freopen("./lin", "w+", lfp);
收到的鲜花
  • 杭012016-02-11 16:06 送鲜花  1朵   附言:我很赞同
2016-02-04 10:51
快速回复:无法实现按ctrl + c 停止 ,再次运行该程序,继续之前的行号,往里面写 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.018140 second(s), 11 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved