prosty problem początkującego:P

0

Witam,
ma taki problem:
(fragmen kodu):
...
ofstrem out("output.txt");
string text;
...
char * begin = strstr(text.c_str(), "func:")
char * end = strstr(begin, "\12")
...
i teraz chciałbym do out zapisać end - begin tylko że jak napisze out << end - begin; to mi zapisuje zwykłego int'a. Jak zrobić zeby zapisał tekst?

Z góry dziękuję z pomoc:)

0

out << end - begin;

A jaki miałby to być text? Przecież ty odejmujesz dwa wskaźniki...

0

chodzi o to żeby zapisało fragmen stringa 'text' od "func:" do "\12".
jak zrobie to tak:
...
int file = open("output.txt", O_WRONLY|O_CREAT, S_IREAD|S_IWRITE);
...
write (file, begin, end - begin);

to działa. I chce uzyskać ten sam efekt ale bez open() i write(). Tylko ze jak pisze out << end - begin to oczywiście mi zaspisuje liczbe.

0

Ja bym to robił raczej jakoś tak:

char* text = "tu dany text";
char* start = strstr( text, "func:" );
int len = strlen( start ) - strlen( strstr( start, "\12" ) );
char* wynik = new char[len];
wynik = strncpy( wynik, start, len );
out << wynik;
delete wynik;
0
wynik = strncpy( wynik, start, len );

wystarczy samo

strncpy( wynik, start, len );

albo

out << strncpy( wynik, start, len )

na jedno wyjdzie

0

W sumie to działa tylko nie do końca. Otóż znajduje od func do \12 tylko że tak wygląda to co zapisuje do pliku:

func:blablablaýýýýÝÝÝ

i nie bardzo wiem skąd jest te siedem(czasmi mniej lub więcej) znaczków na końcu. Jak sprawdze strlen(wynik) to jest np 21 kiedy len wynosi 14. Skąd sie biorą te dodatkowe znaki i jak je usunąć??

0
  1. Powinno chyba być =new char[len + 1]; Ehh... stary błąd:) [swoją drogą dziwne, że flabra go nie wychwycił :p]

  2. Cały kod u mnie wygląda tak ( poprawiona wersja poprzedniego:) ):

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <fstream.h>
#include <conio.h>
//-------------------------------
int main(int argc, char* argv[])
{
char* text = new char[1024];
fscanf(stdin, "%1024[^\n]", text);
char* start = strstr( text, "func:" );
delete text;
if( !start ) return 1;
char* end = strstr( start, "/" );
if( !end ) return 1;
int len = strlen( start ) - strlen( end );
char* wynik = new char[len + 1];
strncpy( wynik, start, len );
cout << wynik;
ofstream out( "c:\\pllik.txt", ios::app );
   if ( !out ) return 1;
out << wynik << endl;
out.close();
delete wynik;
getch();
        return 0;
}

<font color="blue">[</span><font color="red">ADD</span><font color="blue">]</span>
ehhh... flabra, czepiasz się szczegółów. No, może delete text w złym miejscu, ale reszta chyba by przeszła na każdym Systemie;)...

Boś zaczął wnikać, na co ja nie miałem za bardzo czasu :p i nie wiedziałem, że strstr() nie kopiuje znaków, a tylko zwraca wskaźnik, to by w ogóle zmieniło podejście ;)

A tak w ogóle, to faktycznie zrobiłem błędów więcej niż ustawa przewiduje... Aż mi głupio... ;)

0

Chcecie poprawek ? Oki ... ;p

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <iostream.h>
#include <fstream.h>
#include <conio.h>

int main(int argc, char* argv[]){
  char* text = new char[1024];
  fscanf(stdin,"%1023[^\n]", text); // 1023 znaki + miejsce na 0
  char* start = strstr( text, "func:" );
  if(!start)return 1;
  //delete text;                // nie tu!!!
  char* end = strchr( start, '/' ); // to jest lepsze od strstr - tylko jeden znak
  if(!end)end=strchr(start,0);  // gdy brak terminatora, to cala linia
  int len = end - start;  // wskazniki mozna odejmowac
  char* wynik = new char[len + 1];
  strncpy( wynik, start, len )[len]=0;  // i zapomniales o 0 na koncu 
  delete text;   // dopiero tu mozna zwolnic - po skopiowaniu
  cout << wynik;
  ofstream out( "c:\\pllik.txt", ios::app );
  if (!out) return 1;
  out << wynik << endl;
  out.close();
  delete wynik;
  getch();
  return 0;
}

[dopisane]
błedy Krecik zrobiles takie:

  1. w fscanf 1023 znaki, bo inaczej moze byc access violation
  2. delete przeniesc nizej, bo access violation lub zamazanie=utrata danych
  3. brak zera na koncu ciagu tworzonego przez strncpy. (bo np. access violation lub przeklamanie w danych)

// błedy access violation moga wystapic, ale nie musza w zaleznosci od systemu i trybu docelowego, nie mniej jednak są to błędy, ale utrata danych jest zalezna tylko od tego czy system nie zamaze tego kawalka zaraz po zwolnieniu, natomiast przeklamanie, zalezy od tego, czy nie bylo w pamieci jakichs smieci przed przydzieleniem - stad potrzeba zapisania tego 0 na koncu.

// reszta to kosmetyka, ale ze zwroceniem uwagi na szybkosc kodu (end-start jest na pewno szybsze od przerabiania danych przez strlen())

// Krecik nie przejmuj sie, to bardziej dla jaj, ale sam wywolałes wilka z lasu w pkt. 1)

1 użytkowników online, w tym zalogowanych: 0, gości: 1