2015-08-23 5 views
1

Я пытаюсь создать функцию, которая добавляет !! в самом конце каждой строки из (включительно) -to (эксклюзивного) текстового файла. После нескольких осложнений мне действительно удалось. Но не совсем.Нежелательные пробелы в выходном файле


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-е изд дополнительная площадь 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- of-a-specific-range-of-lines-in-a-file) больше не актуально. Удалите его. –

+0

Я предлагаю вам использовать двоичный режим для ваших файлов: 'fopen (...," ... b ")' – pmg

+0

@pmg он вообще не работает в двоичном режиме (данные преобразуются в unsigned char) – Malina

ответ

2

Ваше условие цикла не так:

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

После добавляется содержимое в несколько строк, конец последней строки перемещается за пределы filesize и, таким образом, больше не будут рассматриваться.

Вы проверяете, достигнут ли конец буфера с помощью i[buffer] == '\0', но это может привести к чтению за пределами буфера после выполнения всех сдвигов, и есть еще несколько конечных нулей. Это не должно происходить, потому что сначала проверяется условие конечной линии, но лучше быть безопасным с помощью calloc, введя еще один символ, который затем сделаетстроку с нулевым завершением.

Когда вы меняете меньше строк, чем запрошено, потому что у файла нет запрошенных строк – говорят, что вы меняете строки с 20 по 40 в 30-строчном файле –, вы все еще печатаете конечные нули. Вы можете либо напечатать буфер с нулевым концом, либо строку, либо вы должны отслеживать фактический объем добавляемых данных.

Вы сохраняете два избыточных количества строк, lines и ln. Выберите один и удалите другой; он только бесполезно смешивает код.

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 символа в конце, прежде чем добавлять '!!' –

Смежные вопросы