2014-10-09 1 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

+0

Так что мне нужно сделать его' sizeof (block_file) + 1'? –

ответ

3

sizeof(block_file) не дает вам размер файла. Он даст вам размер указателя файла, возможно, четырех или восьми байтов. Вероятно, восемь в вашем случае, так как вы говорите, что читаете "74.125.2", что составляет восемь байтов, а затем идет по haywire. Вам нужно будет использовать что-то вроде stat() в системе POSIX или в комбинации fseek() и ftell().

Вы также должны открывать файлы в двоичном режиме, если вы собираетесь использовать fread() или fwrite(), поскольку они являются функциями ввода-вывода двоичного файла. Это не повлияет на UNIX-системы, но может быть и на Windows, например. Вы не должны смешивать текстовые и двоичные функции ввода-вывода так, как вы по этой причине.

Вы также должны проверять доход от звонков fopen(), чтобы убедиться, что они преуспели.

И что функция bash(), которую вы используете, также полностью сломана. У вас будет утечка памяти каждый раз, когда она вызывается, потому что она никогда не free() s output, и это делает ту же ошибку sizeof, что и вы, хотя она по-прежнему будет работать из-за того, что она находится внутри. Она просто растратит всю эту память он был выделен. И вы утечки памяти, потому что вы никогда не free(request). И вам лучше никогда не будет #include в нескольких единицах перевода, если вы не хотите, чтобы все ошибки определения были повсюду. Вся эта «библиотека» пронизана ошибками школьного типа, на самом деле, включая повторные неудачи проверки возврата с malloc(), выделения памяти для размещения указателя вместо того, на что она указывает, и так далее.

+0

Да! Спасибо! как правильно. Для всех, кто работает в одной и той же проблеме, вот пример, который я использовал, чтобы определить, как настроить 'fseek()' и 'ftell()'. http://stackoverflow.com/a/238607 –

1

Вы открываете файл block_file для "write only". Попробуйте изменить параметр режима на «w +», то есть FILE block_file = fopen («.blog_sites», «w +»); Если вы хотите открыть существующий файл, а не создавать новый каждый раз, используйте «r +» или «a +» вместо «w +».

+0

Спасибо за ваш Ответ: Я просто попытался преобразовать его в «w +», и он начал работать. Однако он достиг только «74.125.2», который является частью первого IP-адреса. Он повторно ассоциирует IP-адреса и доменные имена с блокировать вредоносные или ненавистные сайты. –

+0

Мне нужно было бы увидеть, что делает ваша функция «bash», хотя я бы сделал обоснованное предположение, что это вложение нулевого символа в данные. printf и fprintf будут выводить только строку до первого нулевой символ. – user3354015

+0

Функция bash находится в строке 139: https://github.com/Pavelovich/lib-c/blob/master/stdfn.h –

Смежные вопросы