2015-01-04 134 views
-1

這樣我就可以完成(不完全正確的,但對我很好)的內容從一個叫將Order.txt更新一個txt文件內容

文件listage文件具有以下

比方說,我們目前的時間是14:59

將Order.txt

FILE1.TXT; 5; 15:00

FILE2.TXT; 6; 15:01

file3.txt; 7; 15:02

FILE1.TXT; 2; 15:03

FILE1.TXT; 5; 15:05

FILE2.TXT; 2; 15:06

FILE1.TXT; 3; 15:07

所以基本上,「文件名」;「列出了X秒」,「開始於上市##:##」

該文件將打開,然後列出上面給出的順序所有內容,直到那很好。

但是,現在我需要在使用時保存每個文件,列出的總列表數量以及列出的總時間,以及是否有上市時間(基本上,如果它是按照順序排列的.txt文件)

例如,它應該是這樣的:

used.txt

FILE1.TXT; 4; 15; 1 (1 - 是在order.txt,0 - 它不,這樣做後,我可以做這個,如果我刪除了它的時間),它會改變

FILE2.TXT; 2; 8; 1

file3.txt; 1; 7; 1

基本上, 「文件名」; 「totalTimeItAppears」; 「totalSecondsItShows」; 「IfItIsInOrder.txt」

而且,如果用戶決定再次顯示將Order.txt,它仍然保持不變,當然,它需要再次更新,並將有新的值(在這種情況下,將會有新的值升是上面兩次)

used.txt

FILE1.TXT; 8; 30; 1個

file2的。TXT; 4; 16; 1

file3.txt; 2; 14; 1

我試着已經這樣做了我的代碼,但它只是工作的第一時間,大概只有如果有兩次相同的值,在這種情況下,file1.txt顯示4次,所以它可能不會工作,所以我刪除了代碼。我試着去思考不同的方式,但不能正確地更新它。

這是我的代碼,顯示了將Order.txt:

 orderFile = fopen("order.txt","r"); 

     if(orderFile != NULL) 
     { 
      fseek(orderFile, 0, SEEK_END); 
      size = ftell(orderFile); 
      rewind(orderFile); 

      if(size == 0) 
      { 
       printf("\n< No files to list >\n\n"); 
       fclose(orderFile); 
      } 
      else 
      { 
       while(fscanf(orderFile," %49[^;];%d; %49[^\n]\n",fileName,&seconds,timeValue) == 3) 
       { 
        contentFile = fopen(fileName,"r"); 

        if(contentFile != NULL) 
        { 
         sscanf(timeValue,"%d:%d",&hour,&min); 
         fseek(contentFile, 0, SEEK_END); 
         size = ftell(contentFile); 
         rewind(contentFile); 

         if(size == 0) 
         { 
          printf("\n< Scanned File has nothing to list >\n\n"); 
          fclose(contentFile); 
         } 
         else 
         { 
          time_t now; 
          time(&now); 

          struct tm file_time_tm; 
          file_time_tm = *localtime(&now); 
          file_time_tm.tm_hour = hour; 
          file_time_tm.tm_min = min; 
          file_time_tm.tm_sec = 0; 
          file_time_tm.tm_isdst = -1; 
          time_t fileTime = mktime(&file_time_tm); 

          diff_time = difftime(fileTime, now); 

          if(diff_time > 0) 
          { 
           defaultFile = fopen("default.txt","r"); 
           while(fscanf(defaultFile,"%[^\t]",defaultContent) == 1) 
           { 
            printf("%s\n", defaultContent); 
           } 
           fclose(defaultFile); 
           sleep(diff_time); 

           while(fscanf(contentFile,"%[^\t]",textContent) == 1) 
           { 
            printf("%s\n", textContent); 
           } 
           fclose(contentFile); 
           sleep(seconds); 
          } 
          else 
          { 
           if(diff_time < 0) 
           { 
            diff_time2 = diff_time + 86400; 

            defaultFile = fopen("default.txt","r"); 
            while(fscanf(defaultFile,"%[^\t]",defaultContent) == 1) 
            { 
             printf("%s\n", defaultContent); 
            } 
            fclose(defaultFile); 
            sleep(diff_time2); 

            while(fscanf(contentFile,"%[^\t]",textContent) == 1) 
            { 
             printf("%s\n", textContent); 
            } 
            fclose(contentFile); 
            sleep(seconds); 
           } 
           else 
           { 
            if(diff_time == 0) 
            { 
             while(fscanf(contentFile,"%[^\t]",textContent) == 1) 
             { 
              printf("%s\n", textContent); 
             } 
             fclose(contentFile); 
             sleep(seconds); 
            } 
           } 
          } 
         } 
        } 
        else 
        { 
         sscanf(timeValue,"%d:%d",&hour,&min); 
         printf("\n< File does not exist >\n\n"); 
         fclose(contentFile); 
        } 
       } 

     fclose(orderFile); 
      } 
     } 
     else 
     { 
      printf("\n< File does not exists, please create it again >\n\n"); 
      fclose(orderFile); 
     } 

     printf("\n"); 

我所知道的是,睡眠時間(秒)後我應該把它添加到used.txt,但我不知道如何只添加一次,如果還有其他更新的話。我雖然關於使用「r +」,所以它會寫在該行的頂部,但在我的程序中,我可以重命名文件,所以如果file1.txt將重命名爲file.txt,一個字符仍然會在那裏,並在最終會是; 11(1或0應該是)。

任何有關如何在每次文件正確更新時添加它的想法?


我已經試過這至今:

tempFile = fopen("temp.txt","w"); 
utilizadosFicheiro = fopen("utilizados.txt","r"); 

while(fscanf(utilizadosFicheiro," %49[^;];%d;%d;%d",ficheiroNome,&nApresentacao,&tempoAcumulado,&escalonamento) == 4) 
{ 
    fseek(tempFile, 0, SEEK_END); 
    size = ftell(tempFile); 
    rewind(tempFile); 

    if(size == 0) 
    { 
    fprintf(tempFile,"%s;%d;%d;%d\r\n",ficheiroNome,nApresentacao,tempoAcumulado,escalonamento); 
    } 
    else 
    { 

    while(fscanf(tempFile," %49[^;];%d;%d;%d",ficheiroNome2,&nApresentacao2,&tempoAcumulado2,&escalonamento2) == 4) 
    { 
     if(strcmp(ficheiroNome,ficheiroNome2) == 0) 
     { 
     // Edit the line with tempFile "r+" 
     } 
     else 
     { 
     // Keep line with tempFile "r" 
     fprintf(tempFile,"%s;%d;%d;%d\r\n",ficheiroNome,nApresentacao,tempoAcumulado,escalonamento); 
     } 
    } 
    } 
} 

ficheiroNome =文件名

nApresentacao = timesListedNumber

tempoAcumulado = totalSecondsListed

escalonamento = 「時間」 (W生病或者是1或0)

+1

從我能理解的碎片中,最簡單的方法是「將文件加載到內存結構中 - >修改結構 - >將整個文件寫回去」。 – keltar 2015-01-04 16:38:39

+0

嗯,我不知道該怎麼做,順便說一下,我編輯了我的文章,併爲更新部分做了一個代碼,你介意查看它是否正確?如果有評論(代碼),我應該怎麼做? – Ran 2015-01-04 16:50:42

回答

0

它可以更容易與代碼回答:

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

struct used_entry_s { 
    char name[128]; 
    int num_occurances; 
    int seconds_total; 
    int in_order_flag; 
}; 

struct order_entry_s { 
    char name[128]; 
    int seconds; 
    unsigned long long start; 
}; 

/* first read from used.txt */ 
int read_entries(struct used_entry_s *entries) { 
    FILE *f = fopen("used.txt", "r"); 
    struct used_entry_s entry; 
    int ne = 0; 

    if(!f) { 
     return 0; 
    } 

    while(fscanf(f, "%[^;];%d;%d;%d\n", entry.name, &entry.num_occurances, 
       &entry.seconds_total, &entry.in_order_flag) == 4) { 
     memcpy(&entries[ne], &entry, sizeof(entry)); 
     ne++; 
    } 

    fclose(f); 

    return ne; 
} 

/* save in-memory used entries to file, overwriting its contents */ 
void save_entries(const struct used_entry_s *entries, int num_entries) { 
    int i; 
    FILE *f = fopen("used.txt", "w"); 
    if(!f) { 
     return; 
    } 

    for(i = 0; i != num_entries; ++i) { 
     fprintf(f, "%s;%d;%d;%d\n", entries[i].name, entries[i].num_occurances, 
       entries[i].seconds_total, entries[i].in_order_flag); 
    } 

    fclose(f); 
} 

/* update in-memory entries with given file */ 
int update_entries(const char *filename, struct used_entry_s *entries, 
     int num_entries) { 
    int ne = num_entries; 
    FILE *f = fopen(filename, "r"); 
    char time_str[128]; 
    struct order_entry_s entry; 

    if(!f) { 
     return num_entries; 
    } 

    while(fscanf(f, "%[^;];%d;%[^\n]\n", entry.name, &entry.seconds, time_str) == 3) { 
     /* maybe convert time_str to time_t here, I'm too lazy for that */ 

     int i; 
     for(i = 0; i != ne; ++i) { 
      if(strcmp(entries[i].name, entry.name) == 0) { 
       /* got match, update it */ 
       entries[i].seconds_total += entry.seconds; 
       entries[i].num_occurances++; 
       break; 
      } 
     } 

     if(i == ne) { 
      /* no match found - add new one */ 

      strcpy(entries[ne].name, entry.name); 
      entries[ne].num_occurances = 1; 
      entries[ne].seconds_total += entry.seconds; 
      entries[ne].in_order_flag = 1; 

      /* increase number of entries */ 
      ne++; 
     } 
    } 

    fclose(f); 

    return ne; 
} 


int main(int argc, char **argv) { 
    /* maximum number of entries in used.txt */ 
#define MAX_USED_ENTRIES 128 
    struct used_entry_s used_entries[MAX_USED_ENTRIES]; 
    int num_entries = read_entries(used_entries); 

    num_entries = update_entries("order.txt", used_entries, num_entries); 
    num_entries = update_entries("order.txt", used_entries, num_entries); 

    save_entries(used_entries, num_entries); 

    return 0; 
} 

它依賴於MAX_USED_ENTRIES爲恆定,從不檢查溢出。如果需要,這可以得到改進,但這不是問題的話題。