2017-06-21 56 views
-6

例如如何逐塊讀取文件?

---- BEGIN CERTIFICATE ---- 
dfaskfjdjkjfkdckdjkfjkdfjdlfjdlf 
dfsdkfjdkjfldjfkjdlfjdlkcmdklfkd 
dkfjlkdjfkldjfkljdlfjdlfjdkljkcl 
---- END CERTIFICATE ---- 
---- BEGIN PRIVATE KEY ---- 
ksajfjdfkjjdkfjkdjlfjdkfkdjfkdjf 
dfdkljfkdjkfjdkljfkldjfldjlfkjdl 
---- END PRIVATE KEY ---- 

我想---- BEGIN榮譽證書---- ----以END CERTIFICATE ----部分在一個文件中,另一個---- BEGIN PRIVATE KEY ---- - 以---- END PRIVATE KEY ---在另一個文件..

在C語言中,任何人都可以幫我請

+3

閱讀一條線,如果它是一個開始,然後閱讀線,直到你找到一個結束,重複。 –

+0

用csplit做起來會更容易 –

回答

3

這個邏輯應該爲你工作。這是根據@RetiredNinja

FILE *input = fopen("input.txt", "r"); 
if(!input){ 
    //Appropriate error messages 
    return -1; 
} 

char line[100]; //increase this if your line can be bigger 

char filename[100];  
int file = 0; 
sprintf(filename, "output_%d.txt", file++); 
FILE *output = fopen(filename, "w"); 
if(!output){ 
    //Appropriate error messages 
    return -1; 
} 
fgets(line, 100, input); 

char *read = NULL; 

while(1) { 
    read = fgets(line, 100, input); 
    if (read == NULL) 
     break; 
    if (strcmp("---- END PRIVATE KEY ----", line)==0){ 
     fclose(output); 
     sprintf(filename, "output_%d.txt", file++); 
     output = fopen(filename, "w"); 
     if (!output){ 
      //Appropriate error message 
      return -1; 
     } 
     fgets(line, 100, input); 
    }else{ 
     fputs(line, output); 
    } 

} 
fclose(output); 

這假定第二部分僅僅是第一結束後開始的註釋。 如果在部分之間可能有空的空間,您將不得不循環直到看到起點線。

+1

@Stargateur我認爲OP可以檢查這些東西。由於在答案中,我想集中討論拆分如何完成。就像你自己說的,我們不是一個代碼寫作服務。所以OP需要照顧這些事情。 –

+1

我相信用我的回答我已經幫助OP足夠了。無論如何,我會爲'fopen'添加檢查,並會對文件名進行一些操作。 –

+0

@Stargateur爲什麼你刪除了你的評論? –