2016-05-05 15 views
-5

Ich habe einige Fragen, ich möchte Eingabe .txt Dateiparameter lesen und output.txt schreiben. Ich kann nur eine Zeile finden, wie kann ich alle Zeile das gleiche für diese Frage finden? und wenn input.txt Datei parameter löschen, löscht output.file die Zeichen.lese Datei und schreibe Datei in C

input.txt Datei Details

write: 3 a 4 b 1 \n 2 d 
delete: 1 a 2 b 

output.txt zuerst Paramater gilt

aaa bbbb 

dd 

output.txt zweite Paramater gelten werden

aa bb 

dd 

dank führen führen werden für Ihre Antwort im Voraus

#include <stdio.h> 
    #include <stdlib.h> 
    #include<string.h> 
    int main(void) 
    { 
    FILE *read, *write;  /* files pointers */ 
    char *source_file = "input.txt"; 
    char *dest_file= "output.txt"; 
    int count; 
    char ch; 
    char choose []="write"; 
    int z=0; 
    if((read=fopen(source_file, "r")) == NULL) /* files check ? */ 
    { 
    printf("%s didnt' open .\n", source_file); 
    exit(1); 
    } 
    if((write=fopen(dest_file, "w")) == NULL) 
    { 
    printf("%s didnt. open \n", source_file); 
    exit(2); 
    } 
    fscanf(read,"%s%d%c",&choose,&count,&ch); 
    while((ch = fgetc(read)) != EOF) 
    { 
     printf("%d%c",count,ch); 
     z=0; 
     for (; z<count; z++) 
     { 
      fprintf(write,"%c",ch); 
      printf("\n"); 
     } 
     fprintf(write," "); 
     fscanf(read,"%d%c",&count,&ch); 
     printf("\n"); 
    } 
    fclose(read); /* files close */ 
    fclose(write); 
    printf("%s > %s\n",source_file, dest_file); 
    return 0; 
    } 
+0

0) '1 \ n '->' 2 \ n' 1) 'char wählen [] = "Schreiben";' klein für 'löschen'. 2)% s% d% c "' -> '"% [^:]:% d% c "' kann aber '\ n' (zwei Zeichen) nicht lesen – BLUEPIXY

+0

Vielen Dank für Ihre Antwort, wenn ich versuchte ich sah den Fehler, Wie kann ich das Problem lösen? – youngman

+0

Der Vorschlag, ich denke, dass jede gute (und einfach), wenn Sie behandelt nach dem Löschbefehl auf den Schreibbefehl anwenden. ZB 'write: 3 a 4 b 1 \ n 2 d löschen: 1 a 2 b' ==> update schreiben command zu 'schreiben: 2 a 2 b 1 \ n 2 d' – BLUEPIXY

Antwort

0

versuchen, diese (einige Prüfung entfällt):

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

typedef struct task { 
    int id; 
    char ch; 
    int times; 
    struct task *next; 
} Task; 

typedef struct task_list { 
    Task *head; 
    Task *tail; 
} TaskList; 

typedef enum mode { NOP, WRITE, DELETE } Mode; 

Task *new_task(int id, int freq, char aChar); 
void add_taskList(TaskList *list, Task *task); 
void update_taskList(TaskList *list, Task *task); 
void drop_taskList(TaskList *list); 
void fout_taskList(FILE *fp, TaskList *list); 

int main(void) { 
    char line[1024]; 
    char command[16]; 
    TaskList list = { NULL, NULL}; 
    FILE *fp; 
    int i = 0; 

    fp = fopen("input.txt", "r"); 
    while(fgets(line, sizeof line, fp)){ 
     int len, pos = 0; 
     Mode mode = NOP; 

     sscanf(line, " %15[^:]:%n", command, &len); 
     pos += len; 

     if(!strcmp(command, "write")) 
      mode = WRITE; 
     else if(!strcmp(command, "delete")) 
      mode = DELETE; 
     else 
      continue;//ignore 

     int freq = 0; 
     char aChar; 
     while(2 == sscanf(line + pos, "%d %c%n", &freq, &aChar, &len)){ 
      if(aChar == '\\'){ 
       char esc_char = line[pos + len]; 
       len += 1; 
       switch(esc_char){ 
       case 'n': 
        aChar = '\n'; 
        break; 
       case 't': 
        aChar = '\t'; 
        break; 
       case ' ': 
        aChar = ' '; 
        break; 
       } 
      } 
      Task *task = new_task(++i, freq, aChar); 
      if(mode == WRITE) 
       add_taskList(&list, task); 
      else //if(mode == DELETE) 
       update_taskList(&list, task); 

      pos += len; 
     } 
    } 
    fclose(fp); 
    fp = fopen("output.txt", "w"); 
    fout_taskList(fp, &list); 
    fclose(fp); 

    drop_taskList(&list); 
    return 0; 
} 

Task *new_task(int id, int freq, char aChar){ 
    Task *new_task = malloc(sizeof(*new_task)); 

    if(new_task){ 
     new_task->id = id; 
     new_task->times = freq; 
     new_task->ch = aChar; 
    } 
    return new_task; 
} 

void add_taskList(TaskList *list, Task *task){ 
    if(list->head){ 
     list->tail = list->tail->next = task; 
    } else { 
     list->head = list->tail = task; 
    } 
} 
void update_taskList(TaskList *list, Task *task){ 
    Task *p = list->head; 
    while(p){ 
     if(p->ch == task->ch){ 
      p->times -= task->times;//if(p->times < 0) p->times = 0; 
      if(task->id > 0){//Execute only the first found element 
       break; 
      } 
     } 
     p = p->next; 
    } 
} 
void drop_taskList(TaskList *list){ 
    Task *p = list->head; 
    while(p){ 
     Task *tmp = p->next; 
     free(p); 
     p = tmp; 
    } 
    list->head = list->tail = NULL; 
} 
void fout_taskList(FILE *fp, TaskList *list){ 
    char prev = '\n'; 
    Task *p = list->head; 
    while(p){ 
     for(int i = 0; i < p->times; ++i){ 
      fputc(prev = p->ch, fp); 
     } 
     if(prev != '\n') 
      fputc(' ', fp); 
     p = p->next; 
    } 
} 
+0

[DEMO] (http://ideone.com/xQzclF) – BLUEPIXY

Verwandte Themen