Рассмотрим следующие 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 строки текста?