2015-08-23 68 views
1

我試圖創建一個函數,在從文本文件(包含)到(排除)的每一行的最後附加!!。我經歷了幾次併發症後,確實成功了。但不完全。輸出文件中的不需要的空格


int incldue_auto (char *script, unsigned int offsetLine, unsigned int endLine) 
{ 
    size_t fileSize; 
    size_t content = (endLine - offsetLine) * 3; // New characters 
    char *buffer; 
    FILE* fp; 

    if((fp = fopen(script, "r")) == NULL)        //return(1); 
    if(fseek(fp, 0l, SEEK_END) != 0)         //return(2); 
    if((fileSize = ftell(fp)) == (-1l))         //return(3); 
    if(fseek(fp, 0l, SEEK_SET) != 0)         //return(2); 
    if((buffer = calloc(fileSize + content, sizeof(char))) == NULL)  //return(4); 
    if(fread(buffer, sizeof(char), fileSize, fp) != fileSize)   //return(5); 
    if(fclose(fp) == EOF)            //return(6); 
    { 
     int i, i2; 
     int lines = 0, ln = 0; 
     for(i = 0; i < fileSize; i++) 
     { 
      if(ln >= (endLine - offsetLine) || i[buffer] == '\0') break; 
      if(i[buffer] == '\n') 
      { 
       lines++; 

       if(lines >= offsetLine && lines < endLine) 
       { 
        char* p = (buffer + i); // \n 

        //if(*(p - 1) == '\n') continue; 

        memmove(p + 3, 
          p, 
          strlen(p)); // <-- Problematic line (I think) 

        memcpy(p, " !!", 3); 

        i += 3; 
        ln++; 
       } 
      } 
     } 

     fp = fopen(script, "w"); 
     fwrite(buffer, fileSize + content, sizeof(char), fp); 
     fclose(fp); 
    } 
    free(buffer); 
    return 0; 
} 

它相對工作得很好,除了它不追加到最後一行。並且它最後用空格填充文本文件(可能爲NULL)。 我想這是因爲我也動了enzero-ED額外面積content與:

memmove(p + 3, 
     p, 
     strlen(p)); // <-- Problematic line (I think) 

enter image description here 所以,也許我需要弄清楚什麼是適當的公式我在爲了使這種使用工作。 任何想法如何使這項工作?

+1

大概,這意味着你的舊問題[在文件中特定範圍的行尾添加字符](http://stackoverflow.com/questions/32132572/appending-characters-at-the-end-特定範圍的文件中的行)不再相關。請刪除它。 –

+0

我建議你對你的文件使用二進制模式:'fopen(...,「... b」) – pmg

+0

@pmg在二進制模式下根本不工作(數據轉換爲無符號字符) – Malina

回答

2

你的循環條件是錯誤的:

for(i = 0; i < fileSize; i++) 

已追加到一些線路的內容後,最後一行的末尾移動超過filesize,因此將不再進行治療。

您測試緩衝區的末端是否已經到達i[buffer] == '\0',但是可能會導致在完成所有班次後讀取超出緩衝區,並且存在nio更多尾隨零。這不應該發生,因爲首先檢查終止線條件,但更好的做法是再加一個字符,然後使buffer爲零終止的字符串。

由於文件沒有被請求的行–說你在30行文件–中將行20移動到40,所以你仍然打印出結尾的零。您可以將零終止的緩衝區打印爲字符串,也可以跟蹤實際添加的數據量。

您保留兩個冗餘行計數,linesln。選擇一個並移除另一個;它只是不必要地混淆了代碼。

0

也許你可以把一個條件在循環:

if(lines >= offsetLine && lines < endLine) 
{ 
    ...//your code here before 'memcpy(p, " !!", 3);' 
    if(lines==endline) 
    { 
     memmove(p + 3, p, strlen(p));  
    } 
    //the end of your code here: 
    memcpy(p, " !!", 3);//your code here 
    i += 3; 
    ln++; 
} 

然後你就進入3個字符,如果這是最後一行,並把「!」在這之後。

+0

您可能需要在添加'!!'之前刪除3個字符 –