2013-04-28 2 views
0

Я пишу программу c, которая имитирует оболочку linux.C программирование - freopen append a? в filename

Для реализации перенаправления ввода/вывода с использованием символа перенаправления, то есть символа>, я использую freopen для замены stdout файлом, указанным пользователем. Если говорить команда:

environ > bla.txt 

Моя оболочка будет печатать переменные среды в bla.txt файл вместо стандартный вывод.

Однако вместо создания файла «bla.txt» созданный файл «bla.txt?».

Может ли кто-нибудь решить тайну за? прилагается к имени файла?

Вот код для ввода/вывода только перенаправлением:

char *inFile; 

pid_t pid;  
int rc;   

/* keep reading input until "quit" command or eof of redirected input */ 
while (!feof(stdin)) 
{ 
    /* get command line from input */ 
    if (fgets (buf, MAX_BUFFER, stdin)) // read a line 
    { 

     inFile = strstr(buf, ">");   // look for redirection arrow > in the command 
     if(inFile != NULL)     
     { 
      pid = fork(); 

      if(pid == 0)        
       freopen(inFile+2, "w", stdout);  
      else if(pid == -1)  
       syserr("fork");  
      else 
       waitpid(pid,&rc,0);   
     } 
    } 
} 

Я попытался прибегая к помощи решения, но ничего не могу найти. Я также пробовал смотреть на другой вопрос stackoverflow, но не могу найти ответ.

Спасибо.

+2

As (по существу) всегда, 'while (! feof (что угодно))' сломана. Вы хотите: 'while (fgets (...))'. –

+0

@JerryCoffin, спасибо за совет! – ImNoob

ответ

4

На странице fgets человек:

fgets() считывает максимум один меньше символов размера из потока и сохраняет их в буфер, на который указывает с. Чтение останавливается после EOF или новой строки. Если прочитана новая строка, она сохраняется в буфере. [...]

Вам нужно раздеть маркер конца-строки из строки, в противном случае вы будете в конечном итоге с именем файла, содержащего его (и большинство оболочек/реализации ls заменит что с ? по умолчанию).

+0

ах я вижу. Это объясняет, почему, когда я набираю «dir» в терминал, имя файла добавляется с помощью \ n. Я пытался найти \ n, используя strcmp, но он не возвращает 0 ?? – ImNoob

+0

'strcmp' - это не то, что вы используете для поиска вещей в строках. Вы показали, что уже знаете 'strstr', который может быть использован для этого. Или 'strchr', если вы только заботитесь о концах строк в стиле Unix. – Mat

+0

^решите его, сняв символ новой строки. Я создал свой собственный метод удаления ненужного символа из строки. Благодаря мат :) – ImNoob

0

написать кусок кода на языке С, который решает мой нижеуказанными цели ------

пусть у меня есть папка с именем диким, состоящей 5 files-- кошки, собаку, лошадь, львом, тигр

теперь используют C/Java (обработка файлов понятие) написать код, чтобы переименовать эти файлы как ---

животное кошка, животное собака, животное лошадь, животное лев, животное тигр

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