2012-11-25 147 views
1

如果我讀文件在C++這樣的:文件讀取C++和EOF

//Begin to read a file 
    FILE *f = fopen("vids/18.dat", "rb"); 
    fseek(f, 0, SEEK_END); 
    long pos = ftell(f); 
    fseek(f, 0, SEEK_SET); 

    char *m_sendingStream = (char*)malloc(pos); 
    fread(m_sendingStream, pos, 1, f); 
    fclose(f); 
    //Finish reading a file 

我有2個問題,第一:這是讀取整個文件嗎? (我希望這樣做),以及第二如何創建一個持續到文件結束的時間?我有:

while(i < sizeof(m_sendingStream))

,但我不知道,如果這個工程,我一直在讀左右(我從來沒有在C++編程)之前,我想我可以使用eof()但顯然這是不好的做法。

+1

這不是C++,實際上這是C. – Lior

+0

以及我有人告訴我它是C++,有人告訴我這是C我真的不知道區別。 – Tsundoku

+0

這種使用文件的風格是C風格。使用C++中的文件主要是使用fstream庫。 你可以在這裏閱讀更多關於使用C++處理文件的信息: http://www.cplusplus.com/doc/tutorial/files/ – Lior

回答

2

從文件讀取時,循環不應該是必需的,因爲您將一次性獲取整個代碼。您仍然應該記錄和檢查過程的返回值,:

size_t const n = fread(buf, pos /*bytes in a record*/, 1 /*max number of records to read*/, f); 

if (n != 1) { /* error! */ } 

您也可以編寫一個循環讀取直到文件的末尾,而不事先知道文件的大小(例如,從管道或增長的文件中讀取):

#define CHUNKSIZE 65536 
char * buf = malloc(CHUNKSIZE); 
{ 
    size_t n = 0, r = 0; 

    while ((r = fread(buf + n, 1 /*bytes in a record*/, CHUNKSIZE /*max records*/, f)) != 0) 
    { 
     n += r; 

     char * tmp = realloc(buf, n + CHUNKSIZE); 

     if (tmp) { buf = tmp; } 
     else  { /* big fatal error */ } 
    } 

    if (!feof(f)) 
    { 
     perror("Error reading file"); 
    } 
} 
+0

我不太明白,所以我可以在裏面添加if? – Tsundoku

+0

@LuisArmando:沒有「時間」。你可以像我一樣做一個單獨的檢查,或者你寫一個循環(但是沒有「if」)。 –

+0

所以我可以在我的'long pos = ...'行之前添加你的'size_t const ...'行,然後我可以像你一樣使用單個檢查,或者檢查'n!= pos'我明白了嗎? – Tsundoku

1

這是對文件進行操作時,C++風格將使用fstream庫的空調風格。

關於你的第二個問題,檢查你是否在文件末尾的一個好方法是使用feof函數。

+1

不,他不會讀1個字節,他會讀* *正確的* 1'pos'字節的大記錄。 – vladr

+0

@vladr對不起,我的壞,編輯。 – Lior