URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 7870
[ Назад ]

Исходное сообщение
"Помогите разобратся с С"

Отправлено Slava_D , 30-Янв-09 15:24 
Привет Всем!
пытаюсь написать маленькую прогу, которая с stdin пишет все в файл, но вот не хочет она у меня записывать в файл никак, пример

#include <stdio.h>
#define BUFSIZE 1024

int 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;
}
в чем может быть проблемма?


Содержание

Сообщения в этом обсуждении
"Помогите разобратся с С"
Отправлено phpcoder , 30-Янв-09 15:28 
>в чем может быть проблемма?

Советую начать с проверки значения, которое возвращает fopen()



"Помогите разобратся с С"
Отправлено Slava_D , 30-Янв-09 15:42 
>Советую начать с проверки значения, которое возвращает fopen()

Оно создаёт файл, но в него ничего не пишет, попробывал под виндой скомпилировать, после первого запуска писала в файл, потом фигу...


"Помогите разобратся с С"
Отправлено phpcoder , 30-Янв-09 15:49 
>>Советую начать с проверки значения, которое возвращает fopen()
>
>Оно создаёт файл, но в него ничего не пишет, попробывал под виндой
>скомпилировать, после первого запуска писала в файл, потом фигу...

Только что скомпилировал и запустил под Линуксом. Всё работает.



"Помогите разобратся с С"
Отправлено Slava_D , 30-Янв-09 15:57 
>>>Советую начать с проверки значения, которое возвращает fopen()
>>
>>Оно создаёт файл, но в него ничего не пишет, попробывал под виндой
>>скомпилировать, после первого запуска писала в файл, потом фигу...
>
>Только что скомпилировал и запустил под Линуксом. Всё работает.

А у меня не хочет под фрёй, создаёт файл и не пишет ничего туда.
    if (fp==NULL)
    {
        printf("Error");
        return 0;
    }
все проходит нормально!


"Помогите разобратся с С"
Отправлено Slava_D , 30-Янв-09 16:07 
причем если написать так, то работает

#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;
}


"Помогите разобратся с С"
Отправлено Slava_D , 30-Янв-09 16:11 
>Только что скомпилировал и запустил под Линуксом. Всё работает.

Попробуй phpcoder запусти её несколько раз, будет ли работать, мож она не делает fclose(fp), и эти записи в буфере хронятся, т.к. while (fgets (line, sizeof (line), stdin)) - это как я понимаю бесконечный цикл, и выход из него Ctrl-C, и файл не закрывается - может такое быть???


"Помогите разобратся с С"
Отправлено phpcoder , 30-Янв-09 16:16 
>>Только что скомпилировал и запустил под Линуксом. Всё работает.
>
>Попробуй phpcoder запусти её несколько раз, будет ли работать, мож она не
>делает fclose(fp), и эти записи в буфере хронятся, т.к. while (fgets
>(line, sizeof (line), stdin)) - это как я понимаю бесконечный цикл,
>и выход из него Ctrl-C, и файл не закрывается - может
>такое быть???

fgets() ждет конца файла (EOF), так что выходить надо по Ctrl+D

А по Ctrl+C ты просто программу вырубал, вот и не работало ничего.



"Помогите разобратся с С"
Отправлено Slava_D , 30-Янв-09 16:26 
>[оверквотинг удален]
>>Попробуй phpcoder запусти её несколько раз, будет ли работать, мож она не
>>делает fclose(fp), и эти записи в буфере хронятся, т.к. while (fgets
>>(line, sizeof (line), stdin)) - это как я понимаю бесконечный цикл,
>>и выход из него Ctrl-C, и файл не закрывается - может
>>такое быть???
>
>fgets() ждет конца файла (EOF), так что выходить надо по Ctrl+D
>
>А по Ctrl+C ты просто программу вырубал, вот и не работало ничего.
>

Спасибо, заработало, но появилась еще одна проблема, прогу пытаюсь написать для сквидЫ, что-то типо внешних аксеслистов, она не умеет выходить по Ctrl+D, чё делать?, каждый раз его закрывать и открывать?


"Помогите разобратся с С"
Отправлено phpcoder , 30-Янв-09 16:31 
>Спасибо, заработало, но появилась еще одна проблема, прогу пытаюсь написать для сквидЫ,
>что-то типо внешних аксеслистов, она не умеет выходить по Ctrl+D, чё
>делать?, каждый раз его закрывать и открывать?

Кто она? Ctrl+D это ты нажимаешь, чтобы обозначить конец файла, а если тебе на вход подадут файл через пайп, то там будет EOF и никакого Ctrl+D нажимать не придётся.

Вообщем, неясно кто запускает твою программу и каким образом.


"Помогите разобратся с С"
Отправлено Slava_D , 30-Янв-09 16:38 
>>Спасибо, заработало, но появилась еще одна проблема, прогу пытаюсь написать для сквидЫ,
>>что-то типо внешних аксеслистов, она не умеет выходить по 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 в любом случае....


"Помогите разобратся с С"
Отправлено phpcoder , 30-Янв-09 16:41 
>external_acl_type my_prog children=1 %LOGIN %SRC /usr/squid/my_prog %u %s

Судя по записи, squid вам передаёт данные не через stdin, а через параметры коммандной строки. Зачем вы тогда из stdin-то читаете? ;)


"Помогите разобратся с С"
Отправлено Slava_D , 30-Янв-09 16:45 
>>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....


"Помогите разобратся с С"
Отправлено angra , 30-Янв-09 17:55 
>что бы выяснить что он передаёт проге и в каком виде, я
>хочу записать в файл и посмотреть что там реально есть, и
>отвечаю ему OK в любом случае....

Зачем тогда С? Неужели вы не знаете ни одного скриптового языка общего назначения?



"Помогите разобратся с С"
Отправлено Slava_D , 30-Янв-09 18:58 
>>что бы выяснить что он передаёт проге и в каком виде, я
>>хочу записать в файл и посмотреть что там реально есть, и
>>отвечаю ему OK в любом случае....
>
>Зачем тогда С? Неужели вы не знаете ни одного скриптового языка общего
>назначения?

Ща написано на перле, до этого было что-то на bash, но на прокси много пользователей, плюс хочу еще некоторую обработку делать, по мимо запросов sql, работа с файлами и т.д, хочу попробывать осилить на С, мне кажется будет быстрей (моё личное мнение, хочу пропрбывать)



"Помогите разобратся с С"
Отправлено angra , 31-Янв-09 02:37 
Вы не поняли. конечный плагин можно и на С делать ради скорости. Но вот для быстрой проверки, что именно передает squid perl/python/etc намного удобней и быстрее.

"Помогите разобратся с С"
Отправлено vic , 30-Янв-09 16:35 
>Спасибо, заработало, но появилась еще одна проблема, прогу пытаюсь написать для сквидЫ,
>что-то типо внешних аксеслистов, она не умеет выходить по Ctrl+D, чё
>делать?, каждый раз его закрывать и открывать?

ну так случиться EOF как и в этом случае:
echo -e "1234\n2345" | proga

если хотите чтобы каждая строка записывалась без буферизации, то либо ее отключите setbuf(), либо вызывайте fflush() после каждой записи.