Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[18.118.171.20] |
|
Сообщ.
#1
,
|
|
|
Есть файл с текстом:
"Мама мыла раму .....всего текста 300кб.....папа помогал ей" Задача: вырезать текст с места "раму" по "папа" и записать в новый файл Если функция в С++ которая ищет заданую подстроку и возвращает индекс первого символа заданой подстроки (аналог в php - strpos) Можно ли в С++ обращаться к строке как к масиву? и как это реализуется через указатели? Обьясните пожалуйста поподробнее с примерами, я новичек и очень хочу разобраться |
Сообщ.
#2
,
|
|||||||||
|
strstr - возвращает указатель на первый элемент найденной подстроки (т.е. на саму подстроку)
можно
|
Сообщ.
#3
,
|
|
|
Если пишешь с использованием MFC то можно использовать методы CString::Find кажется.
В std::string вроде тоже поиск подстроки (символа) реализован. |
Сообщ.
#4
,
|
|
|
"Мама мыла раму .....всего текста 300кб.....папа помогал ей"
А как вырезать с "рама" по "папа" и записать в новый текст то что осталось - "Мама мыла помогал ей" Я делал так: void *buf; int handle, bytes; FILE *newfile; buf = malloc(500000); handle = open("file.txt", O_RDONLY | O_BINARY, S_IWRITE | S_IREAD); bytes = read(handle, buf, 500000); char *pfirst = strstr((char*) buf, "<script>"); char *plast=strstr((char*) buf, "</script>"); int nLength=pfirst; newfile = fopen("file2.txt", "w"); fwrite(buf, nLength, 1, newfile); fclose(newfile); Почему матюгается на int nLength=pfirst; ведь мы писали фактически то же самое int nLength=plast-pfirst; |
Сообщ.
#5
,
|
|
|
Почувствуй разницу - в твоем случае ты переменной типа int присваивашь указатель на char (char*). А в приведенной тобою строчке переменной типа int присваивается разница двух указателей (так называемый ptrdiff_t) - а она обычно имеет тип int. Что бы в твоем случае все было правильно сделай так:
int nLength = pfirst - buf; И еще (совет на будущее) не смешивай потоковый ввод/вывод (fopen, fwrite и т. п.), и низкоуровневым (open, read и т. п.). Выбери чего-нибудь одно. |
Сообщ.
#6
,
|
|
|
Значит теперь чтобы записать последний кусок текста я должен писать:
int nLength = plast- buf; ... запись в файл |
Сообщ.
#7
,
|
|
|
int nLength = bytes - (plast - buf)
|
Сообщ.
#8
,
|
|
|
Почему выдает ошибку такой код
#include <stdio.h> #include <io.h> #include <alloc.h> #include <fcntl.h> #include <process.h> #include <sys\stat.h> #include <iostream.h> int main(void) { FILE *stream; int size=0; char item[1]; stream = fopen("file.txt", "r"); while (! feof(stream)) { fread(item, 1, 1, stream); size++; } fclose(stream); void *buf, *rez, *rezult; int handle, bytes; FILE *newfile; buf = malloc(size); rez = malloc(size); rezult = malloc(size); handle = open("file.txt", O_RDONLY | O_BINARY, S_IWRITE | S_IREAD); bytes = read(handle, buf, size); int k=0; while (k!=1000) { char *pfirst=strstr((char*) buf, "<a>"); char *plast=strstr((char*) buf, "</a>"); k++; if (pfirst) { int lenght=pfirst-(char*)buf; cout <<lenght<<endl; *pfirst=0; newfile=fopen("rez.txt", "a"); fwrite(buf, lenght, 1, newfile); fclose(newfile); buf=plast+4; cout <<buf; } } int a; cin >>a; return 0; } Файл file.txt 111 222 <a>gfggfg</a> sssssssssss ddddddddddd ffffff <a>gfggfg</a> gjhfgjfgj fgjfgjfgj <a>gfggfg</a> rez.txt: 111 222 sssssssssss ddddddddddd ffffff gjhfgjfgj fgjfgjfgj Результат дает правильный но выдает ошибку что-то с памятью не то. Может какое-то другое условие в цыкле поставить? |
Сообщ.
#9
,
|
|||||
|
А почему у тебя именно такое условие в цикле? Пчему не сделаешь так:
|
Сообщ.
#10
,
|
|||
|
Память выделил, а освободить забыл. free(buf); free(rez); free(rezult); |