Привет Всем!
пытаюсь написать маленькую прогу, которая с stdin пишет все в файл, но вот не хочет она у меня записывать в файл никак, пример#include <stdio.h>
#define BUFSIZE 1024int main(int argc, char* argv[])
{
char line[BUFSIZE];
FILE *fp;
fp = fopen("param", "a");
while (fgets (line, sizeof (line), stdin))
{
fputs(line, fp);
printf("OK\n");
}
fclose(fp);
return 0;
}
в чем может быть проблемма?
>в чем может быть проблемма?Советую начать с проверки значения, которое возвращает fopen()
>Советую начать с проверки значения, которое возвращает fopen()Оно создаёт файл, но в него ничего не пишет, попробывал под виндой скомпилировать, после первого запуска писала в файл, потом фигу...
>>Советую начать с проверки значения, которое возвращает fopen()
>
>Оно создаёт файл, но в него ничего не пишет, попробывал под виндой
>скомпилировать, после первого запуска писала в файл, потом фигу...Только что скомпилировал и запустил под Линуксом. Всё работает.
>>>Советую начать с проверки значения, которое возвращает fopen()
>>
>>Оно создаёт файл, но в него ничего не пишет, попробывал под виндой
>>скомпилировать, после первого запуска писала в файл, потом фигу...
>
>Только что скомпилировал и запустил под Линуксом. Всё работает.А у меня не хочет под фрёй, создаёт файл и не пишет ничего туда.
if (fp==NULL)
{
printf("Error");
return 0;
}
все проходит нормально!
причем если написать так, то работает#include <stdio.h>
int main (int argc, char* argv[])
{
FILE *file;
file = fopen("text.txt","a");
fputs("test", file);
fputs("\n", file);
fclose(file);
return 0;
}
>Только что скомпилировал и запустил под Линуксом. Всё работает.Попробуй phpcoder запусти её несколько раз, будет ли работать, мож она не делает fclose(fp), и эти записи в буфере хронятся, т.к. while (fgets (line, sizeof (line), stdin)) - это как я понимаю бесконечный цикл, и выход из него Ctrl-C, и файл не закрывается - может такое быть???
>>Только что скомпилировал и запустил под Линуксом. Всё работает.
>
>Попробуй phpcoder запусти её несколько раз, будет ли работать, мож она не
>делает fclose(fp), и эти записи в буфере хронятся, т.к. while (fgets
>(line, sizeof (line), stdin)) - это как я понимаю бесконечный цикл,
>и выход из него Ctrl-C, и файл не закрывается - может
>такое быть???fgets() ждет конца файла (EOF), так что выходить надо по Ctrl+D
А по Ctrl+C ты просто программу вырубал, вот и не работало ничего.
>[оверквотинг удален]
>>Попробуй phpcoder запусти её несколько раз, будет ли работать, мож она не
>>делает fclose(fp), и эти записи в буфере хронятся, т.к. while (fgets
>>(line, sizeof (line), stdin)) - это как я понимаю бесконечный цикл,
>>и выход из него Ctrl-C, и файл не закрывается - может
>>такое быть???
>
>fgets() ждет конца файла (EOF), так что выходить надо по Ctrl+D
>
>А по Ctrl+C ты просто программу вырубал, вот и не работало ничего.
>Спасибо, заработало, но появилась еще одна проблема, прогу пытаюсь написать для сквидЫ, что-то типо внешних аксеслистов, она не умеет выходить по Ctrl+D, чё делать?, каждый раз его закрывать и открывать?
>Спасибо, заработало, но появилась еще одна проблема, прогу пытаюсь написать для сквидЫ,
>что-то типо внешних аксеслистов, она не умеет выходить по Ctrl+D, чё
>делать?, каждый раз его закрывать и открывать?Кто она? Ctrl+D это ты нажимаешь, чтобы обозначить конец файла, а если тебе на вход подадут файл через пайп, то там будет EOF и никакого Ctrl+D нажимать не придётся.
Вообщем, неясно кто запускает твою программу и каким образом.
>>Спасибо, заработало, но появилась еще одна проблема, прогу пытаюсь написать для сквидЫ,
>>что-то типо внешних аксеслистов, она не умеет выходить по Ctrl+D, чё
>>делать?, каждый раз его закрывать и открывать?
>
>Кто она? Ctrl+D это ты нажимаешь, чтобы обозначить конец файла, а если
>тебе на вход подадут файл через пайп, то там будет EOF
>и никакого Ctrl+D нажимать не придётся.
>
>Вообщем, неясно кто запускает твою программу и каким образом.Запускает её squid, примерно такой строкой
external_acl_type my_prog children=1 %LOGIN %SRC /usr/squid/my_prog %u %s
squid передаёт вроде логин и айпи адрес, и ему надо ответить или OK или ERR,
что бы выяснить что он передаёт проге и в каком виде, я хочу записать в файл и посмотреть что там реально есть, и отвечаю ему OK в любом случае....
>external_acl_type my_prog children=1 %LOGIN %SRC /usr/squid/my_prog %u %sСудя по записи, squid вам передаёт данные не через stdin, а через параметры коммандной строки. Зачем вы тогда из stdin-то читаете? ;)
>>external_acl_type my_prog children=1 %LOGIN %SRC /usr/squid/my_prog %u %s
>
>Судя по записи, squid вам передаёт данные не через stdin, а через
>параметры коммандной строки. Зачем вы тогда из stdin-то читаете? ;)параметры командной строки не нужны это было сделано для другого, а про stdin я посмотрел в исходниках к squid, на пример ip_user_check.c, тама все через stdin....
>что бы выяснить что он передаёт проге и в каком виде, я
>хочу записать в файл и посмотреть что там реально есть, и
>отвечаю ему OK в любом случае....Зачем тогда С? Неужели вы не знаете ни одного скриптового языка общего назначения?
>>что бы выяснить что он передаёт проге и в каком виде, я
>>хочу записать в файл и посмотреть что там реально есть, и
>>отвечаю ему OK в любом случае....
>
>Зачем тогда С? Неужели вы не знаете ни одного скриптового языка общего
>назначения?Ща написано на перле, до этого было что-то на bash, но на прокси много пользователей, плюс хочу еще некоторую обработку делать, по мимо запросов sql, работа с файлами и т.д, хочу попробывать осилить на С, мне кажется будет быстрей (моё личное мнение, хочу пропрбывать)
Вы не поняли. конечный плагин можно и на С делать ради скорости. Но вот для быстрой проверки, что именно передает squid perl/python/etc намного удобней и быстрее.
>Спасибо, заработало, но появилась еще одна проблема, прогу пытаюсь написать для сквидЫ,
>что-то типо внешних аксеслистов, она не умеет выходить по Ctrl+D, чё
>делать?, каждый раз его закрывать и открывать?ну так случиться EOF как и в этом случае:
echo -e "1234\n2345" | progaесли хотите чтобы каждая строка записывалась без буферизации, то либо ее отключите setbuf(), либо вызывайте fflush() после каждой записи.