2015-02-10 1 views
-2

У меня есть код для создания всех возможных ожерелий с фиксированной плотностью, которые мне нужны для работы. Проблема в том, что я слишком noob в c, чтобы решить следующий вопрос: как я могу напечатать результат этого кода на txt вместо консоли? , когда выход достаточно большой, я не вижу всех ожерелий и, очевидно, мне нужно все. Извините за мое ужасное письмо.написать результат выполнения кода c в txt

/********************************************************************* 
* C program to generate fixed density necklaces and Lyndon words. * 
* The algorithm is CAT and is described in the paper by Sawada and * 
* Ruskey "An efficient algorithm for generating necklaces with fixed * 
* density." This program, was obtained from the       * 
* (Combinatorial) Object Server, COS, at http://www.theory.csc.uvic.ca * 
* The inputs are n, the length of the string, k, the arity of the   * 
* string, and d the density, the number of non-0's in the string. * 
* The program can be modified, translated to other languages, etc., * 
* so long as proper acknowledgement is given (author and source). * 
* Programmer: Joe Sawada            * 
**********************************************************************/ 

/*---------------------------------------------------*/ 
/* This program generates all k-ary fixed density */ 
/*  necklaces, Lyndon words or prencklaces  */ 
/*  with length n and density d in lex order  */ 
/*---------------------------------------------------*/ 

#include <stdio.h> 
#include <math.h> 

int a[100]; 
int b[100]; 
int n,k,d,total; 
char type; 

void Print(int p) { 

    int i,j,next,end,min; 

    /* Determine minimum position for next bit */ 
    next = (d/p)*a[p] + a[d%p];  
    if (next < n) return; 

    /* Determine last bit */ 
    min = 1;  
    if (type == 'p') min = k-1; 
    else if ((next == n) && (d%p != 0)) { 
     min = b[d%p]+1; 
     p = d; 
    } 
    else if ((next == n) && (d%p == 0)) { 
     min = b[p]; 
    } 

    /* Determine length of String */ 
    end = n; 
    if (type == 'p') end = n-1; 

    for(b[d]=min; b[d]<k; b[d]++) { 
     i = 1; 
     /* Test for lyndon words */ 
     if ((type == 'l') && (n%a[p] == 0) && (a[p] != n)) {} 
     else { 
      for(j=1; j<=end; j++) { 
       if (a[i] == j) { 
        printf("%d ",b[i]); 
        i++; 
       } 
       else printf("0 "); 
      } 
      printf("\n"); 
      total++; 
     } 
     p = d; 
    }  
} 

void Gen(int t,int p) { 

    int i,j,max,tail; 

    if (t >= d-1) Print(p); 
    else { 
     tail = n - (d - t) + 1; 
     max = ((t+1)/p)*a[p] + a[(t+1)%p]; 
     if (max <=tail) { 
      a[t+1] = max; 
      if ((t+1)%p == 0) b[t+1] = b[p]; 
      else b[t+1] = b[(t+1)%p]; 

      Gen(t+1,p); 
      for (i=b[t+1] +1; i<k; i++) { 
       b[t+1] = i; 
       Gen(t+1,t+1); 
      } 
      tail = max-1; 
     } 
     for(j=tail; j>=a[t]+1; j--) { 
      a[t+1] = j; 
      for (i=1; i<k; i++) { 
       b[t+1] = i; 
       Gen(t+1,t+1); 
      } 
     } 
    } 
} 

void Fixed() { 

    int i,j; 

    /* initialize string */ 
    for(j=0; j<=d; j++) a[j] = 0; 

    if (d == 0) { 
     if (type == 'n') { 
      for (j=1; j<=n; j++) printf("0 "); 
      printf("\n"); 
      total = 1; 
     } 
    } 
    else if (d == 1) { 
     for (i=1; i<k; i++) { 
      for (j=1; j<n; j++) printf("0 "); 
      printf("%d \n",i); 
     } 
     total = k-1; 
    } 
    else { 
     /* For prenecklaces we generate necklaces with */ 
       /* density n+1 and density d+1 and then ignore */ 
       /* the last bit        */  
     if (type == 'p') { n++; d++; } 

     a[0] = 0; 
     a[d] = n; 
     for(j=n-d+1; j>=(n-1)/d + 1; j--) { 
      a[1] = j; 
      for (i=1; i<k; i++) { 
       b[1] = i; 
       Gen(1,1);  
      } 
     } 
    } 
} 

void main() { 

    int i,j; 

    /* type: 'n' necklace or 'l' Lyndon word or 'p' prenecklace */ 
    printf("Enter n k d type: "); 
    scanf("%d %d %d %c", &n, &k, &d, &type); 

    total = 0; 
    Fixed();   
    printf("Total = %d\n",total); 
} 

я пытался использовать fprintf(....); вместо printf(...); ссылающийся на файл без успеха

+1

Объясните * без успеха *. –

+3

Добро пожаловать в переполнение стека.В вашем вопросе есть одна проблема: вы слишком много говорите нам о том, что делает ваша программа, и слишком мало о том, чего она не делает. Нам не нужно знать о ожерельях или других украшениях :), нам также не нужен весь исходный код вашей программы ... это скорее отвлекает вас от вашего фактического вопроса. Кажется, что речь идет о записи вывода в файл вместо консоли. Попытайтесь ограничить свои объяснения и примеры кода только тем, что имеет отношение к основному вопросу. – stakx

+0

Опубликовать программу, в которой вы использовали 'fprintf'. а также указать, что произошло с ошибкой, то есть _it не создавал никакого файла file_ или _created empty file_ или _whatever it_. –

ответ

0

Там два способа сделать это:

  1. Если вы на Linux вы можете просто ./myprogram 2>&1 | tee output.txt когда вы хотите выполнить свою программу, это позволяет записывать выходные данные как для консоли, так и для файла output.txt.
  2. Вы можете использовать системные вызовы для изменения дескриптора файла stdout от 1 (см.: http://en.wikipedia.org/wiki/File_descriptor) к файловому дескриптору файла, для которого вы хотите записать вывод. Чтобы получить файловый дескриптор файла, который вы хотите записать, вы используете системный вызов open (см.: http://codewiki.wikidot.com/c:system-calls:open), так как вы можете увидеть, что он вернет дескриптор файла. Наконец, вам просто нужно поменять дескриптор файла stdout файловым дескриптором, используя системный вызов dup2 (см.: http://linux.die.net/man/2/dup2). Не забудьте закрыть файл в горлышке с помощью системного вызова близко (см: http://codewiki.wikidot.com/c:system-calls:close)

Примечание: Поскольку вы все еще требуют некоторого взаимодействия с пользователем на Бегина вашей программы

printf("Enter n k d type: "); 
scanf("%d %d %d %c", &n, &k, &d, &type); 

если вы выбираете второй вариант, вы можете просто поменять файловый дескриптор после этого взаимодействия, и в конце, когда вы хотите показать результат, просто поменяйте место.

+0

Я считаю, что параметры должны быть с консоли, но сам результат должен быть помещен в файл, так почему бы просто не использовать 'fprintf'? – zoska

0

Оставьте первый Printf и зсапЕ, как это - это параметры программы (вы можете получить их из файла, но я полагаю, что, говоря «результат кода» вы имеете в виду результат алгоритма)

С Учитывая это, мы должны сосредоточиться на Fixed, Gen и печати функции:

Прежде всего - это количество глобальных переменных, которые вы используете, считается плохой практикой:

  • это труднее анализировать код функции
  • имена этих переменных ничего не говорят - в чем цель n, k, d, a, b?

Когда вы работаете над этим, для записи в файл вам нужно передать другой параметр для каждой функции, выход которой вы хотите перенаправить к файлу.

Так fopen() нужный файл в основной (можно запросить у пользователя имя файла для сохранения):

file = fopen(file_name, "w"); 
if (!file) { 
    /* handle file opening error */ 
    ... 
} 

Pass файл Fixed() и Print(), изменить printf(...) к fprintf(file, ...) и fclose() перед отъездом main().

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