2013-07-26 3 views
-4
a.txt  
    #0 p0=1 p100=0 p4=0 p7=1 
    #10 p5=1 p100=1 p8=0 

Если у меня есть имя файла a.txt и я на самом деле будет обрабатывать что-то вроде сдвига конкретного px, например, как показано выше p0,p1,p2. Если, например, в моей командной строке будет иметь переключатель, чтобы определить, который px должен быть сдвиг по #shift_value, такие какнужно алгоритм решения сдвига в C

-shift p100=shift_value15:p5=shift_value4:p7=shift_value2 

так содержание в файле будет изменена, как показано ниже:

a.txt(result) 
     #0 p0=1 p4=0 
     #2 p7=1 
     #10 p8=0 
     #14 p5=1 
     #15 p100=0 
     #25 p100=1 

Поэтому из переключателя включить сдвиг для конкретного px с #shift_value, когда p100, если он равен #0, тогда будет сдвинут на 15 , чтобы стать на #15, где p100 на #10 будет затем смещен на #25 , и поэтому остальные пиксели будут аналогичным образом.

Мне нужен алгоритм, который может выполнять такое поведение, которое после переноса происходит с использованием содержимого в файле a.txt в a.txt (результат).

+0

Что вы хотите делать именно? Я должен признать, что я не понимаю, что такое «алгоритм, чтобы сделать оригинальный a.txt без перехода к смещенному примеру». – Bentoy13

+0

@ Bentoy13 что я имею в виду, я хочу, чтобы a.txt стал a.txt (result). Мне нужен алгоритм, который может сделать смещение, чтобы получить результат, который я хочу динамическим способом. – user2609443

+0

Ладно, в первую очередь: вы не переходите сюда, вы «двигаетесь». Ваш вопрос будет намного яснее для людей, если бы вы просто сказали тему, что вы хотите перенести определенные определения 'px' на определенное количество строк, а ваш переключатель командной строки сообщает программе, что определение' px' должно быть «перемещено» вниз по количеству линий. Мне потребовалось 5 минут, чтобы даже выяснить, что вы пытаетесь сделать, и ваше описание не очень полезно, я понял это только по входным данным, выходным данным и переключателям командной строки. – Mecki

ответ

0

как это (обработка ошибок опущена, strtok_r удален, если strtok_r можно использовать):

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

char *strtok_r(char *str, const char *delims, char **store){ 
    char *p, *wk; 
    if(str != NULL){ 
     *store = str; 
    } 
    if(*store == NULL) return NULL; 
    *store += strspn(*store, delims);//skip delimiter 
    if(**store == '\0') return NULL; 
    p=strpbrk(wk=*store, delims); 
    if(p != NULL){ 
     *p='\0'; 
     *store = p + 1; 
    } else { 
     *store = NULL; 
    } 
    return wk; 
} 

#define SHIFT_KEYWORD "shift_value" 

typedef struct pair { 
    char *key; 
    int val; 
} Pair; 

int cmp(Pair *a, Pair *b){ 
    return strcmp(a->key, b->key); 
} 

Pair *parse_command(const char *commands, int *num_cmd){ 
    char *pc, *cmd = strdup(commands); 

    if(NULL!=(pc = strtok(cmd, " ")) && strcmp(pc, "-shift")!=0){ 
     fprintf(stderr, "command format error!\n"); 
     *num_cmd = 0; 
     free(cmd); 
     return NULL; 
    } 
    char *p; 
    pc = strtok(NULL, " "); 
    *num_cmd=1; 
    for(p=pc;NULL!=(p=strchr(p, ':'));++p){ 
     ++*num_cmd;//count command 
    } 
    Pair *cmds = calloc(*num_cmd, sizeof(Pair)); 
    int c = 0; 
    char *pr1, *pr2; 
    for(p = pc;NULL!=(p=strtok_r(p, ":", &pr1));p=NULL){ 
     const int len = sizeof(SHIFT_KEYWORD)-1; 
     for(;NULL!=(p=strtok_r(p, "=", &pr2));p=NULL){ 
      if(strncmp(p, SHIFT_KEYWORD, len)==0) 
       cmds[c++].val = atoi(p + len); 
      else 
       cmds[c].key = strdup(p); 
     } 
    } 
    qsort(cmds, *num_cmd, sizeof(Pair), (int (*)(const void*,const void*))cmp); 
    free(cmd); 
    return cmds; 
} 

int count_element(FILE *fp){ 
    int ch, count =0; 
    while(EOF!=(ch=fgetc(fp))){ 
     if(ch == '=') 
      ++count; 
    } 
    rewind(fp); 
    return count; 
} 

typedef struct vec { 
    int value; 
    Pair pair; 
} Vec; 

int cmpv(const void *x, const void *y){ 
    Vec *a = (Vec*)x; 
    Vec *b = (Vec*)y; 
    return a->value != b->value ? a->value - b->value : strcmp(a->pair.key, b->pair.key); 
} 

int main(void){ 
    const char *command ="-shift p100=shift_value15:p5=shift_value4:p7=shift_value2"; 
    int num_cmd; 
    Pair *cmd_list; 

    cmd_list=parse_command(command, &num_cmd); 

    FILE *fp=fopen("a.txt","r"); 
    int num_vec = count_element(fp); 
    Vec v[num_vec]; 
    char buff[1024]; 
    int c=0; 
    while(fgets(buff, sizeof(buff), fp)){ 
     char *p; 
     int value; 
     p=strtok(buff, " \n"); 
     if(*p == '#') 
      value = atoi(p+1); 
     else { 
      fprintf(stderr, "data format error\n"); 
      exit(1); 
     } 
     for(;NULL!=(p=strtok(NULL, " \n"));++c){ 
      Pair *cmd; 
      char *pr, *key; 
      int event; 
      pr=strchr(p, '='); 
      *pr = '\0'; 
      key = strdup(p); 
      event = atoi(pr+1); 
      v[c].value = value; 
      v[c].pair.key = key; 
      v[c].pair.val = event; 
      cmd = bsearch(&v[c].pair, cmd_list, num_cmd, sizeof(Pair), (int (*)(const void*,const void*))cmp); 
      if(cmd){ 
       v[c].value = value + cmd->val; 
      } 
     } 
    } 
    fclose(fp); 
    qsort(v, num_vec, sizeof(Vec), cmpv); 

    //stdout -> fp = fopen("a.txt", "w"); 
    int i, pre_value=-1; 
    for(i=0;i<num_vec;++i){ 
     if(pre_value != v[i].value){ 
      if(pre_value!=-1) 
       fprintf(stdout, "\n"); 
      fprintf(stdout, "#%-2d", pre_value=v[i].value); 
     } 
     fprintf(stdout, " %s=%d", v[i].pair.key, v[i].pair.val); 
     free(v[i].pair.key); 
    } 
    for(i=0;i<num_cmd;++i){ 
     free(cmd_list[i].key); 
    } 
    free(cmd_list); 
    return 0; 
} 
+0

Спасибо за предоставление этого. У меня есть идеи из вашего кода. Спасибо большое. :) – user2609443