2014-12-02 16 views
0

我想在文件中打印兩次。代碼如下所示。如何通過僅在最後打開文件來在不同執行點的文件中打印時間?

輸出不正確,它只是打印一些不是當前時間的值。

問題是我必須撥打fprintf只有一次,那也是在最後事實上,當我將緩衝區(包含來自幾個GetLocalTime調用的時間)寫入一個文件時,我可以多次調用fprintf,這不是問題。

我在buffer上打了兩次電話GetLocalTime,好像緩衝區被覆蓋了。

有人可以建議我更優雅的方式來打印執行中不同點的文件時間,並打開文件只有一次? (如果我每個GetLocalTime函數調用後打開文件時,我會增加文件的開銷開放,寫等)

最新: 基於我修改這樣的代碼,它的工作

建議
#include "stdafx.h" 
#include <stdio.h> 
#include <time.h> 
#include <windows.h> 
#include <string.h> 


int main() 
{ 
    SYSTEMTIME st; 

    char *buffer; 

    buffer= (char *)malloc(sizeof(char) * 10000); 

    GetLocalTime(&st); 



      int offset=0; 
offset += sprintf(buffer+offset, "time is %d,%d, %d, %d \n",st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); 
/*Other code*/ 

Sleep(1000); 

GetLocalTime(&st); 

offset += sprintf(buffer+offset, "time is %d,%d, %d, %d \n",st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); 


      FILE * p; 
      p=fopen("test.txt","a"); 
      fprintf(p,"%s",buffer); 
      fclose(p); 



    return 0; 
} 

現在我得到正確的結果!

我運行在Windows 7的代碼與Visual Studio 2010

附加信息

我不能同時採用兩種不同的緩衝區。原因是在實際的代碼中,我將打印時間爲100s,所以我將不得不創建100個緩衝區,我不想這樣做。

我想要做的是這樣的:

GetLocalTime(); 

. 
. //Now put time in buffer at this point 
. 
. 
GetLocalTime(); 
. 

. //Now put time in buffer at this point 
. 
GetLocalTime(); 

. 
.. //Now put time in buffer at this point 
. 
. 
GetLocalTime(); 
    . //Now put time in buffer at this point 



.. 

Now put all the times from several calls in a text file 

最後,我將讓你在文本文件中的所有時序

+0

聲明兩個緩衝區而不是一個。然後用''%s \ n%s \ n「'格式字符串打印它們兩個。 ('%c'不正確,如果你想打印一個字符串而不是單個字符)。 – 2014-12-02 07:57:37

+0

@Jim Lewis我不能使用兩個不同的緩衝區。原因是在實際的代碼中,我將打印時間爲100s,所以我將不得不創建100個緩衝區,我不想這樣做。 – user3891236 2014-12-02 07:59:44

+0

製作一個數組,例如'SYSTEMTIME st [200];'並將函數調用爲GetLocalTime(&st [index]); index ++;'其中'index'是一個初始化爲0的'int'。從數組中直接將'buffer'和'fprintf'擺脫到文件中。 – user3386109 2014-12-02 08:07:42

回答

1

做這個

int offset=0; 
offset += sprintf(buffer+offset, "time is %d,%d, %d, %d \n",st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); 
/*Other code*/ 
offset += sprintf(buffer+offset, "time is %d,%d, %d, %d \n",st.wHour, st.wMinute, st.wSecond, st.wMilliseconds); 

sprintf返回打印到緩衝區中的字符數。

每當您撥打sprintf()時,請繼續更新偏移量並將緩衝區指針偏移那麼多,以便爲下一次調用sprintf()。這樣第一次時間戳不會被覆蓋。

+0

在這種情況下,真的需要使用'snprintf',因爲緩衝區溢出的風險很大。 – 2014-12-02 08:40:10

+0

@sanketh感謝您的建議。我嘗試過這種方式,但我認爲我仍然在做錯事。這次我有一個緩衝區的malloc。請在最新更新下查看我的代碼。 – user3891236 2014-12-02 08:42:01

+0

@sanketh它工作。感謝您的幫助 – user3891236 2014-12-02 09:09:40

0

sprintf的格式化結果到緩衝區開始在緩衝區

的開始

如果您希望兩次都顯示在文件中,或者fprintf到文件 而不是組成緩衝區,請使用兩個緩衝區。或者,更簡單

SYSTEMTIME st1, st2; 

GetLocalTime(&st1); 
Sleep(1000); 
GetLocalTime(&st2); 

... etc 
+0

我不能使用兩個不同的緩衝區。原因是在實際的代碼中,我將打印時間爲100s,所以我將不得不創建100個緩衝區,我不想這樣做。 - – user3891236 2014-12-02 08:00:17

+0

請看我的更新2 – user3891236 2014-12-02 08:09:57

相關問題