2013-07-04 1 views
-2

저는 생성자와 분리 자로 구성된 StringList라는 클래스가 있습니다. 내가 쏘고있는 것은 내 프로그램이 실행되지 않은 후에도 배열의 문자열을 유지하는 능력이다. 이 작업을 수행하는 방법은 내 생성자 함수를 파일에서 문자열을 읽고이를 문자열 배열 (str [])에 저장하는 것입니다. 내 de-structor는 내 현재 문자열을 내 파일에 저장합니다. 메모리를 만들 때 파일에서 읽고 저장하는 데 문제가 있습니다. 각 단어가 배열의 한 요소가되기를 원합니다. 은, 예를 들면로부터 판독되는 파일에 문자열 등이 저장되어파일에서 여러 줄의 문자열을 읽고이를 C++의 문자열 배열에 저장합니다.

HELLO 
MOM 
DAD 
FOUR 
YELLOW 

I가 각 단어가 슬롯 원한다. 다른 말로. str [0] = HELLO, str [1] = MOM, str [2] = DAD 등. 여기

내 생성자 함수입니다 : 여기

StringList::StringList() 
{ 
    numberOfStrings=0; 
    str = new string[1000000]; 

ifstream myfile ("Read.txt"); 
if (myfile.is_open()) 
    { 
     for (int i = 0; i < 1000000; i++) 
     { 
      getline(myfile,str[i]); 
      numberOfString++; 


     } 

     myfile.close(); 
    } 


} 

문제가에 대한 것입니다 (INT I = 0; 나는 < 100000; 내가 ++) 라인 이 될 때까지 요소에 각각 빈 공간을 채우기 위해 계속됩니다 했는가 그것도 100000에 도달했습니다. 같은 경우 나는 <을 20 개 넣었을 때 모든 내용을 읽고 20을 채우도록 공백을 추가합니다. 어쨌든 txt의 실제 문자열 양을 채울 수 있습니까? 파일?

+1

'new'와'delete'를 없애고 벡터를 저장하기 위해 시작할 수 있습니다. 필요에 따라 자동으로 크기를 조정할 수 있습니다. – chris

답변

4

NumberOfStrings++은 읽을 때 (즉 한 번만 증가하는 경우) for 루프 외부에 있습니다. 또한 동적 배열 대신 std::vector<std::string>을 사용하십시오.

여기에 배열 대신 표준 : : 벡터를 사용하여 코드의 버전 : 당신이 볼 수 있듯이

#include <vector> 
#include <fstream> 
#include <iostream> 
#include <string> 

class StringList 
{ 
public: 
    StringList(): str(1000000), numberOfStrings(0) 
    { 
     std::ifstream myfile ("Read.txt"); 
     if (myfile.is_open()) 
     { 
      for (int i = 0; i < str.size(); i++) 
      { 
       getline(myfile, str[i]); 
       numberOfStrings++; 
      } 

      myfile.close(); 
     } 
    } 

    StringList::~StringList() 
    { 
     std::ofstream os("Read.txt"); 
     for (int i = 0; i <numberOfStrings; i++) 
     { 
      os << str[i] << std::endl; 
     } 
    } 

private: 
    std::vector<std::string> str; 
    int numberOfStrings; 
}; 

변경 사항이 아니라 최소한이다.

+0

배열이 정적이 아닙니다. – dreamlax

+0

@Borgleader 죄송합니다. 그러나 이것은 내 프로그램에서 작동하지 않습니다. 내 프로그램의 목적은 1000000 개의 문자열을 보유하는 문자열 배열을 중심으로 회전합니다. 이 str []을 사용하는 여러 함수가 이미 구현되어 있으며 벡터 을 수용하기 위해이 함수를 모두 다시 작성하고 싶지 않습니다. 내 길을 사용하여 어쨌든 그것을 할 수 있습니까? 죄송합니다. 원래 게시물은 – WestonBuckeye

+0

입니다. 연산자 []는 벡터에서 사용할 수 있습니다. 또한 공사 도중 100000 개의 아이템으로 만들 수 있습니다. – Borgleader

1

변수는 for 루프가 완료된 후에 한 번만 업데이트됩니다. 또한 실패를 위해 getline의 리턴 값을 검사하여 많은 수의 행을 지정할 필요없이이를 단순화 할 수 있습니다. 지난 파일을 읽으려고하면 getline이 false를 반환합니다.

numberOfStrings = 0; 
str = new std::string[1000000]; 
std::ifstream myfile("Read.txt"); 
if (myfile.is_open()) 
{ 
    std::string line; 
    while(getline(myfile, str[numberOfStrings])) 
     numberOfStrings++; 
    myfile.close(); 
} 

std::vector을 사용하면이 문제를 더욱 단순화 할 수 있습니다. 대답에 제공된 예제를 확장하려면 StringList 아래와 같이 보일 수 있습니다.

#include <vector> 
#include <string> 

class StringList 
{ 
public: 
    StringList(); 
    void PrintWords(); 
private: 
    size_t numberOfLines; 
    std::vector<std::string> str; 
}; 

StringList.cpp 각 스트링

#include "StringList.h" 
#include <fstream> 

StringList::StringList() 
{ 
    std::ifstream myfile("Read.txt"); 
    if (myfile.is_open()) 
    { 
     std::string line; 
     while(getline(myfile, line)) 
     { 
      lines_.push_back(line); 
     } 
     myfile.close(); 
    } 
    numberOfLines = str.size(); 
} 

StringList에 한줄 읽을

StringList.h.CPP는 나는 또한 using namespace std를 사용하여 피하는 것이 좋습니다 단어

StringList::PrintWords() 
{ 
    for(size_t i = 0; i < numberOfLines; ++i) 
    { 
     std::cout << str[i] << std::endl; 
    } 
} 

를 인쇄 할 std::istream_itertorstd::copy

#include "StringList.h" 
#include <fstream> 
#include <istream> 
#include <algorithm> // std::copy 
#include <iterator> // istream_iterator 

StringList::StringList() 
{ 
    std::ifstream myfile("Read.txt"); 
    if (myfile.is_open()) 
    { 
     std::copy(
      istream_iterator<string>(myfile), 
      istream_iterator<string>(), 
      back_inserter(str)); 
    } 
    numberOfLines = str.size(); 
} 

몇 가지 다른 기능을 사용하여 각 문자열로 하나의 단어로 읽기 귀하의 코드입니다. std에서 현재 범위 (일반적으로 전역 이름 공간)로 모든 것을 가져오고 식별자와 충돌을 일으킬 수 있습니다.

+0

미안하지만, 나는 초보자 프로그래밍입니다. 내 생성자 함수에서 그것을 올바르게 작성하는 방법을 보여 주시겠습니까? 이 작업을하기 위해 라이브러리를 추가해야합니까? – WestonBuckeye

+0

현재 답변에 링크 된 문서를 검토하는 동안 예제를 추가하겠습니다.) –

+0

어떤 설명서가 있습니까? 이 파일을 읽고 각 단어를 문자열 배열의 슬롯에 저장하기 만하면됩니다. 당신이 보여준 것을 어디에 삽입합니까? – WestonBuckeye

0

이것은 데이터 읽기에 대한 나의 접근 방법입니다.이 방법은 다른 답변과 동일하게 작동하지 않지만 단어 목록에 공백이있는 단어가 없으면 잘 작동합니다.

#include <iostream> 
#include <fstream> 
#include <iterator> 
#include <vector> 

int main() 
{ 
    std::fstream myFile("read.txt"); 
    if (myFile.is_open()) 
    { 
     std::istream_iterator<std::string> iter(myFile), end; 
     std::vector<std::string> str(iter, end); 

     // print contents 
     for (int i = 0; i < str.size(); i++) 
      std::cout << i << ": " << str[i] << std::endl; 
    } 
} 

참고 :

  1. istream_iterator
  2. vector

당신은 std::vector 당신이 원하는 모든 것을 회피 계속 할 수 있지만,이 같은 시나리오, 그것은을위한 최상의 도구입니다 일.

+0

이 프로그램은 advancedcommandLine 인터페이스를 사용합니다. 나는 int main을 가지고 있지 않으며 그 내용을 인쇄하고 싶지도 않다. – WestonBuckeye

+0

OP가 한 번에 전체 줄을 읽었으므로 이미 제안했지만 제거했습니다. Vector가 멤버 변수가되는 것을 다루기 위해'std :: copy'를 사용하는 것조차 포함합니다.) 그리고'StringList'에 대한 수정 이외의 다른 예제를 포함하지 않을 것입니다. –

+1

@WestonBuckeye :이 대답의 요점은 완전한 컴파일 가능한 프로그램을 사용하여 파일의 내용을 읽는 방법을 설명합니다. 실제로 여기 관련있는 모든 작업을 수행하는 코드는 네 줄뿐입니다. – dreamlax

관련 문제