2014-10-09 49 views
0

我一直在嘗試很長時間來弄清楚如何讓程序從文件中讀取文本。我已經嘗試過使用fgets()和循環的解決方案。程序運行但不打印變量,表明文本未被提取。我不能得到fread()將文件內容打印到字符串變量

#include <stdio.h> 
    #include <string.h> 
    #include "stdfn.h" 


    int main(int argc, char* argv[]) 
    { 
     char* request; 
     char bf_text[1024]; 
     char character; 

     intro("Site Blocker", 2014, "MIT"); 

     request = bash("curl http://redsec.ru/blocked_sites.txt"); // Source of bash() is at line 139 https://github.com/Pavelovich/lib-c/blob/master/stdfn.h 
     //printf("%s", request); 

     FILE* block_file = fopen(".blocked_sites", "w+"); // Changed from "w" based on this thread, currently only outputs a small part of the file. 
     FILE* hosts = fopen("hosts", "w"); 
     FILE* hosts_tmp = fopen(".hosts", "w"); 

     // Print the text of the web request to the temporary 
     // .blocked_sites file 
     fprintf(block_file, "%s", request); 

     rewind(block_file); 
     fread(bf_text, sizeof(block_file), 1, block_file); 
     printf("%s", bf_text); 

     fclose(block_file); 
     return 0; 
    } 
+0

'fread(bf_text ...','bf_text'沒有以''\ 0''結尾, – chux 2014-10-09 01:35:16

+0

那麼我需要使它成爲'sizeof(block_file)+ 1'? – 2014-10-09 01:46:26

回答

3

sizeof(block_file)不會給你文件的大小。它會給你一個文件指針的大小,可能是四個或八個字節。在你的情況下可能有八個,因爲你說它正在讀取"74.125.2",這是八個字節,然後就會出現故障。您需要在POSIX系統上使用stat()fseek()ftell()的組合。

如果您打算使用fread()fwrite(),您還應該以二進制模式打開文件,因爲它們是二進制文件IO功能。例如,它在UNIX系統上不會有什麼區別,但它可能在Windows上。由於這個原因,你不應該真正地混合文本和二進制模式IO函數。

您還應該檢查來自fopen()調用的回報以確保它們成功。

而且你使用的bash()函數也完全破壞了。每次調用它時都會發生內存泄漏,因爲它永遠不會出現free() s output,並且它與您的錯誤相同,儘管它仍會因爲它所在的循環而工作。它只會浪費所有內存它分配。而正在泄漏內存,因爲你從來沒有free(request)。除非你想在整個地方出現多個定義錯誤,否則你最好不要在多個翻譯單元中使用它。整個「圖書館」充滿了男生型錯誤,事實上,包括屢次失敗,檢查從malloc()返回的內容,分配內存以適應指針,而不是它指向的內容,等等。

+0

是的!謝謝!這個w正確。對於遇到同樣問題的其他人,以下是我用來查看如何設置'fseek()'和'ftell()'的示例。 http://stackoverflow.com/a/238607 – 2014-10-09 03:38:30

1

您正在爲「只寫」打開block_file。嘗試將模式參數更改爲「w +」,即 FILE block_file = fopen(「。blocked_sites」,「w +」); 如果要打開現有文件而不是每次都創建一個新文件,請使用「r +」或「a +」而不是「w +」。

+0

謝謝你的支持我只是嘗試將它轉換爲「w +」並開始工作,但它只能得到「74.125.2」,這是第一個IP地址的一部分,它將IP地址和域名重新關聯到阻止惡意或可惡的網站 – 2014-10-09 01:28:40

+0

我需要看看你的「bash」函數是幹什麼的,儘管我會猜測它是在數據中嵌入一個空字符printf和fprintf將只輸出一個字符串到第一個null字符 – user3354015 2014-10-09 01:33:20

+0

bash函數在139行: https://github.com/Pavelovich/lib-c/blob/master/stdfn.h – 2014-10-09 01:42:09