Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

RusFAQ.ru: Программирование на C / C++


РАССЫЛКИ ПОРТАЛА RUSFAQ.RU

/ КОМПЬЮТЕРЫ И ПО / Языки программирования / C/C++

Выпуск № 658
от 05.02.2007, 01:05

Администратор:Калашников О.А.
В рассылке:Подписчиков: 473, Экспертов: 63
В номере:Вопросов: 1, Ответов: 2


Вопрос № 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


Отправить вопрос экспертам этой рассылки

Приложение (если необходимо):

* Код программы, выдержки из закона и т.п. дополнение к вопросу.
Эта информация будет отображена в аналогичном окне как есть.

Обратите внимание!
Вопрос будет отправлен всем экспертам данной рассылки!

Для того, чтобы отправить вопрос выбранным экспертам этой рассылки или
экспертам другой рассылки портала RusFAQ.ru, зайдите непосредственно на RusFAQ.ru.


Форма НЕ работает в почтовых программах The BAT! и MS Outlook (кроме версии 2003+)!
Чтобы отправить вопрос, откройте это письмо в браузере или зайдите на сайт RusFAQ.ru.


© 2001-2007, Портал RusFAQ.ru, Россия, Москва.
Идея, дизайн, программирование: Калашников О.А.
Email: adm@rusfaq.ru, Тел.: +7 (926) 535-23-31
ООО "Мастер-Эксперт Про", Москва, 2007
Авторские права | Реклама на портале
Версия системы: 4.43 beta от 26.01.2007
Яндекс Rambler's Top100

В избранное