2014-01-08 3 views
1
------------------------------------------------ 
      Artikli vo magacin za obleka   
------------------------------------------------ 
Vo magacinot ima vkupno 5 artikli 
------------------------------------------------ 
Sifra : 3 
Opis : opis2 
Edinecna cena : 212 
Vlezna kolicina : 2 
Izlezna kolicina : 0 
Danocna stapka : 0 
Iznos : 424 
Datum na vlez : 20324 
------------------------------------------------ 
Sifra : 3 
Opis : 54 
Edinecna cena : 123 
Vlezna kolicina : 12 
Izlezna kolicina : 0 
Danocna stapka : 0 
Iznos : 1476 
Datum na vlez : 120915 
------------------------------------------------ 
Sifra : 3 
Opis : opsi2 
Edinecna cena : 12 
Vlezna kolicina : 324 
Izlezna kolicina : 0 
Danocna stapka : 0 
Iznos : 3888 
Datum na vlez : 570509 
------------------------------------------------ 
Sifra : 2 
Opis : vopi 
Edinecna cena : 2 
Vlezna kolicina : 2 
Izlezna kolicina : 0 
Danocna stapka : 0 
Iznos : 4 
Datum na vlez : 951230 
------------------------------------------------ 
Sifra : 1 
Opis : opis1 
Edinecna cena : 2 
Vlezna kolicina : 2 
Izlezna kolicina : 0 
Danocna stapka : 0 
Iznos : 4 
Datum na vlez : 101 
------------------------------------------------ 

위의 내용은 "directory.dat"파일이며 특정 텍스트가 포함 된 특정 줄의 정수를 어떻게 제거 할 수 있습니까? 예를 들어, "Edinecna cena"로 모든 줄의 합을 만들고 싶다면 어떻게 그 줄로부터 모든 정수를 구할 수 있습니까?디렉토리에서 특정 형식의 라인의 특정 부분을 얻는 방법은 무엇입니까?

+0

모든 행을 가져 와서 첫 번째 비 문자를 검색해야합니다. 그런 식으로 정수를 찾으십시오. 모든 ":"는 모든 정수 앞에 있으므로 구분 기호로 사용할 수도 있습니다. –

+0

'awk '/ Edinecna cena/{sum + = $ NF; $ NF 인쇄} END {print sum}''? – twalberg

+0

@ twalberg 그게 무슨 뜻입니까? – user2699298

답변

2

당신은 (으로 0x499602D2eof()없이 적절한 접근 방식이 제안) 줄 단위가 파일을 읽을 수 있습니다

ifstream dir("directory.dat"); 
string line; 
while(getline(dir, line)){ 
    //(process the line) 
} 

당신의 라인 (string priceLn = "Edinecna cena : ";)는 라인의 시작과 일치 확인 여부, 그리고 가격을 추출 :

// process the line: 
if(line.find(priceLn)==0){ 
    price = stoi(line.substr(priceLn.size())); 
} 

PS : 파일을 읽는 동안strncmp() 작은 오버 헤드가 발생할 수 있습니다. 다음과 같이 if 문을 다시 작성할 수 있습니다.

if(line.size() >= priceLn.size() && 
    strncmp(line.c_str(), priceLn.c_str(), priceLn.size()) == 0) {...} 
+0

정확히 어떻게 가격을 "추출"합니까? – user2699298

+0

@ user2699298 'price = stoi (line.substr (priceLn.size()));'또는'+ ='연산자를 사용하여 모든 가격을 누적 할 수 있습니다. –

+0

'while (! eof())'는 근본적으로 잘못되었습니다. 'while (getline (dir, line)) '으로 변경하십시오. – 0x499602D2

1

정규식 라이브러리를 사용하여 정규식을 만들어 파일을 한 줄씩 파싱 할 수 있습니다.

/(Edinecna cena) : (\ d +)/당신이 요청한 예제에 대한 해결책으로 작동합니다. 정수는 두 번째 그룹에 포함되며 첫 번째 그룹의 항목을 검색하려는 항목으로 바꿀 수 있습니다.

+0

C++에서 Regex를 사용 해 본 적이 없지만, 라이브러리 #include 는 C++ 11에서만 사용할 수 있습니다.이 프로젝트에서는 사용할 수 없습니다. – user2699298

+0

그렇다면 단순한 strncmp shou 충분하다. 찾고있는 문자열의 길이를 n으로하여 각 줄에서 호출 한 다음 줄에서 ':'을 찾고 색인에서 +2를 찾고 거기에서 시작하는 문자열을 정수로 변환하십시오. 이것도 마찬가지로 작동 할 것이고, 정규식만큼이나 깨끗하지는 않습니다. – Nate

+0

내 예제에서 strncmp를 사용하는 방법에 대한 약간의 스 니펫을 제공해도 괜찮겠습니까? strncmp 내부의 인수만으로 충분합니다. – user2699298

관련 문제