Добавляемые строки, разделенные символом «\» друг с другом в файле - PullRequest
0 голосов
/ 04 октября 2018

Рассмотрим следующие 2 строки:

cc -std=c99   -Wall -pedantic -Werror -o calcmarks \
                      calcmarks.o globals.o readmarks.o correlation.o -lm

Обратите внимание на символ \ в конце первой строки;в контексте этого вопроса и вышеупомянутого текстового файла этот символ указывает на то, что следующая строка в текстовом файле должна быть добавлена ​​к предыдущей строке, а символ \ удален.Например, вышеприведенные 2 строки необходимо добавить, чтобы они стали:

cc -std=c99   -Wall -pedantic -Werror -o calcmarks calcmarks.o globals.o readmarks.o correlation.o -lm

Я хотел бы написать функцию на C, которая, учитывая указатель FILE* на текстовый файл, добавляет строки, аналогичныевыше (где первая строка заканчивается символом \ перед символом новой строки) и поместите их обратно в текстовый файл.

Моей первой мыслью было создание временного файла вкоторый я написал бы в каждой строке, кроме двух рассматриваемых строк, вместо добавления добавленной версии этих двух строк.Тем не менее, функция C fread () - очень дорогой вызов памяти, и поэтому я хотел бы сделать все записи внутри структур данных и исходного файла.Вот что я смог сделать до сих пор:

// Append lines after lines with the '\' character at the end to each other
rewind(outputPtr); // remember this was set to write mode
char mainline[1000]; // the main line we are dealing with
char nextline[1000]; // the next line, if mainline ends with the '\' character
bool concatenate = false; // if the previous line ends with the '\' character, set this to true
int lineCounter = 0; // Increment whenever a line has been read
int copyCounter = 0; // Counter to use when copying over a line, compare this with lineCounter

while (fgets(mainline , sizeof(mainline) , outputPtr) != NULL) {
    if (concatenate) { // If the previous line ended with the '\' character, thus setting this boolean to true
        strcpy(mainline , nextline);
        // What do I do now?

    }
    for (int i = 0; ; i++) { // Note the lack of condition testing - remember to break from the loop manually!
        if (mainline[i] == '\0' || mainline[i] == '\n') { // 'i' index at first instance of null or newline character
            if (mainline[i - 1] == '\\') { // If the last non-whitespace character is the '\' character
                mainline[i - 1] = '\0'; // Replace the backslash with the null character
                concatenate = true;
                for (int j = 0; j <= i; j++) {
                    nextline[j] = mainline[j]; // We copy over to nextline as mainline will be overwritten in the next
                                               // iteration of this loop
                }
            }
            break; // We have found the first end of line, so break
        }
    }
    lineCounter++;
}

Я отмечу здесь, что файл, на который указывает outputPtr, был открыт в режиме записи.

Я немного застрялв точке сразу после линии strcpy(mainline, nextline);Я не совсем уверен, как действовать после этого.У меня нет возможности узнать, к какой строке в текстовом файле я подхожу, и я не уверен, как скопировать новую добавленную строку (хранящуюся в массиве символов mainline) вместо двух первоначально разделенныхlines.

Как написать код для замены пар строк, разделенных символом '\' перед символом новой строки '\ n', одной строкой, представляющей собой объединенные 2 строки текста?

...