Вопрос № 73328: Спасайте!!!! Срочно нужен программный код следующего формата (на языке С): удаление строк в текстовом файле по номеру строки, а также по ключевому элементу. Please!!!...
Вопрос № 73.328
Спасайте!!!! Срочно нужен программный код следующего формата (на языке С): удаление строк в текстовом файле по номеру строки, а также по ключевому элементу. Please!!!
Отправлен: 30.01.2007, 20:12
Вопрос задал: Eug (статус: Посетитель)
Всего ответов: 2 Мини-форум вопроса >>> (сообщений: 6)
Отвечает: Mefisto
Здравствуйте, Eug!
http://www.sao.kchr.ru/hq/sts/linux/book/bogatyrev_c_unix/ex_9.shtml Вот что нашел по удалению/вставке строк
Что имеется ввиду под "по ключевому элементу"
Ответ отправил: Mefisto (статус: 1-ый класс)
Ответ отправлен: 30.01.2007, 21:41
Отвечает: Mihasic
Здравствуйте, Eug!
Вот, набросал пример...
Так как изначально не известно, что конкретно есть "ключевой элемент", то сделал через делегат (my_delegate). Т.е. мы передаем функцию заданного типа, которая определяет - писать строку (return 1) или нет (return 0). В готовой программе советую по-своему реализовать, в зависимости от задания.
del_str возвращает тоже что-то наподобие bool'а. Протестил под 2003 студией - работает :)
#include <stdlib.h>
#include <stdio.h>
char* read_line(FILE *fp) {
int c;
char *buffer;
char *tmp;
int buf_pos = 0;
int eol = 0;
if (!fp)
return NULL;
buffer = malloc(1 * sizeof(char)); // size == buf_pos + 1
if (!buffer)
return NULL; // памяти мало
c = fgetc(fp);
while (!feof(fp) && !eol) {
eol = c == '
';
buffer[buf_pos++] = c;
// расширяем буффер
tmp = realloc(buffer, (buf_pos + 1) * sizeof(char));
if (!tmp) {
free(buffer);
return NULL; // опять с памятью лажа
}
buffer = tmp;
c = fgetc(fp);
}
buffer[buf_pos] = ' return buffer;
}
typedef int (my_delegate)(long, char*);
int del_str(const char *filename, const char *tempfilename, my_delegate func) {
FILE *fin;
FILE *fout;
char *buf;
long cur_line = 0; // нумерация строк ваще-то с единицы, просто так легче
fin = fopen(filename, "r");
if (!fin) {
return 0;
}
fout = fopen(tempfilename, "w");
if (!fout) {
fclose(fin);
return 0;
}
while (!feof(fin)) {
buf = read_line(fin);
if (!buf) {
fclose(fin);
fclose(fout);
return 0;
}
cur_line++;
if (func(cur_line, buf)) {
fprintf(fout, "%s", buf);
}
free(buf);
}
fclose(fin);
fclose(fout);
if (remove(filename)) {
remove(tempfilename);
return 0; // не удалось удалить оригинал
}
if (rename(tempfilename, filename)) {
remove(tempfilename);
return 0; // не удалось переименовать
}
return 1;
}
int test_line(long line_num, char *line) {
// просто не пишем определенные номера... тут это статически, но это дело вкуса
switch (line_num) {
case 1:
return 0;
case 4:
return 0;
case 7:
return 0;
default:
// остальное пишем
return 1;
}
// на всяк случай... чтоб не было ворнинга
return 1;
}
int main() {
if (del_str("c:\temp\1.txt", "c:\temp\2.txt", test_line))
printf("success");
return 0;
}
Ответ отправил: Mihasic (статус: 9-ый класс)
Ответ отправлен: 31.01.2007, 14:32