2014-11-07 4 views
0

문자 배열 (문자 배열 [MAX_ROW] [MAX_COL])에 문자의 텍스트 파일을 읽으려고하는데 텍스트 파일에 문자 배열보다 적은 행과 열이 있습니다. 이것은 텍스트 파일 내에있는 물질 물질을 지나쳐 읽는 문제를 일으 킵니다. 나는 다음과 같은 방법을 사용하여 읽을 때이 문제로 실행 :object.get()을 사용하여 텍스트 (2D 배열에 더 많은 행과 열이 있음)보다 큰 매개 변수가있는 2D 배열로 텍스트를 읽으려면 어떻게해야합니까?

ifstream whiteboard; //ifstream object for reading from a file. 
    whiteboard.open(board_name.c_str()); 

    for(int i = 0; i < MAXROW; i++){ //naive read for canvas, not considering the /n characters or the size of the image.txt 
     for(int j = 0; j < MAXCOL; j++){ //for this to store the print properly it must be the exact size of the image dimensions 
       canvas[i][j] = whiteboard.get(); 
      if(whiteboard.get() == '/n'){ 
       return; 
      } 
      else if(whiteboard.get() != '/n'){ 
      canvas[i][j] = whiteboard.get(); 
      } 
     } 
    } 

    whiteboard.close(); 

위 단지 '/ n'은 문자가 지점으로 2 차원 배열을 통해 실행하도록되어 코드. 따라서 어떤 크기의 배열로도 들어갈 수 있습니다. 개행 문자는 텍스트 파일의 각 텍스트 줄 끝에 입력 키 스트로크 형태로 나타납니다. 파일로 읽기는 줄 바꿈을 읽을 때 중지됩니다. 그러나이 올바르게 구현하는 데 문제가 있습니다. 누구든지이 사실을 더 분명하게 볼 수있는 힌트가 있습니까? 고마워요!

편집 :

입력 파일

xxxxxxxxxxxxxx 
x   x 
x   x 
x   x 
x   x 
x   x 
xxxxxxxxxxxxxx 

내가 문자 배열의 해당 값에 (그 안에 포함 된 자사의 ''모든 문자와 함께) 위의 상자 입력 기대하고있다. 마지막 x (오른쪽 하단)을 읽은 후 x의 가장 오른쪽 열을 읽은 후에 읽음을 멈추고 싶습니다. 내 문제는 여기에 내 텍스트 상자의 크기보다 큰 배열을 가지고 오는 것을 볼 수 있습니다. 문자 배열을 텍스트 상자와 동일한 크기로 동일하게 처리하여이 문제를 해결할 수 있다고 생각하지만 비교적 큰 크기의 파일을 읽을 수 있도록 충분히 큰 상수를 유지하려고합니다.

+1

''/ n'' -> ''\ n'' –

+0

줄 바꿈을 읽었을 때 파일 읽기를 중단 하시겠습니까? 아마도 아주 작은 샘플 입력 파일을 제공하면 문제를 설명하는 데 도움이됩니다. – Julian

답변

0

나는 하나 개의 솔루션이를 수행 다음

파일 내용 미만 1024x1024의 문자를 가질 때까지 매트릭스 어레이 충전
int n=1025, m=1024, MAX_LINES=1025, i=0, j=0; 
char character, Matrix[n][m]; 
fstream file; 
file.open("file.txt", ios::in); 
while (file.get(character))// loop executes until the get() function is able to read contents or characters from the file 
{ 
Matrix[n][m]=character; // copy the content of character to matrix[n][m], here n is used to work as lines and m as normal arrays. 
m++; // finished copying to matrix[n][m] then m++ else the program will overwrite the contents to the same array. 
If (m>=1024)// if string[n][m] reached the limit which is 1024. 
{ 
Matrix[n][m]='\0'; //termimate that line 
m=0;// start with a new column 
if (n<MAX_LINES)// if n is less than 1024 then 
n++;// write to a next line because m can support only 1024 chars. 
} 
Matrix[n][m]='\0';// this will terminate the whole string not just one line. 
file.close(); 

는 U 파일로부터 문자 입력을 증가시킬 수 있지만, 인을 다 이상 4킬로바이트 복용하는데 문제에 직면 매트릭스에 따 ... 나는 내 대답 pls는 심지어 조금 후 +1 투표를 도움이된다면이, U 도움이되기를 바랍니다

...

+0

예,이 답변은 많은 도움이됩니다. 특별히 자세한 설명을 해주셔서 감사합니다 (가장 작은 것들이 가장 도움이 됨). 코드의 흐름을 상당히 쉽게 캡처 할 수있었습니다. 감사합니다! 내 평판이 아직 15에 없기 때문에 나는 지금 투표 할 수 없습니다.그러나 나는 그 질문에 너무 잘 대답 할 수있는 체크 마크를 주었다. 고맙습니다! –

+0

U taylor에게 감사 드리고 싶습니다. 그냥두고 간다고했는데, 코드에서 뭔가 오류가 있습니다. n과 m은 0으로 초기화해야합니다. 매트릭스 배열은 char 매트릭스 [1024] [1025]에 의해 수동으로 만들어야합니다. 기다려, 내 대답 편집 ... – Rishabh

0

당신은이 같은 뭔가를 찾고있다 : 항상 파일의 "배열"랬 ... 당신이 파일의 내용으로 매트릭스를 채울 수이 코드

ifstream whiteboard; 
whiteboard.open(board_name); 

if (!whiteboard.is_open()) 
{ 
    // do something here... 
} 

char c; 
int row = 0, col = 0; 

while (whiteboard.get(c)) 
{ 
    if (c == '\n') 
    { 
     row++; 
     col = 0; 
     continue; 
    } 

    canvas[ row ][ col++ ] = *reinterpret_cast< unsigned char * >(&c); 
} 

whiteboard.close(); 

는 배열에 들어가 canvas[][]

0

배열을 사용하는 데 제한이없는 경우 캔버스의 크기를 동적으로 조정할 수있는 대체 솔루션을 추가하고 싶습니다.

using std::vector; 

std::ifstream whiteboard(board_name); 

vector<vector<char>> canvas; 
canvas.emplace_back(); 
// ^Replace with push_back(vector<char>()); if not using C++11 

char c; 
while (whiteboard.get(c)) { 
    if (c == '\n') { 
     canvas.emplace_back(); // See above 
    } 
    else { 
     canvas.back().push_back(c); 
    } 
} 
사용 중 루프 또는 인덱스 (반복자는 너무 일을하지만 못생긴)를 사용하여 범위를 기반으로 캔버스를 반복하도록 결정할 수 있습니다

:

// Loop through using range-based for (C++11) 
for (auto& row : canvas) { 
    for (auto& col : row) { 
     std::cout << col; 
    } 
    std::cout << std::endl; 
} 

// Loop through using index 
for (int i = 0; i < canvas.size(); i++) { 
    for (int j = 0; j < canvas[i].size(); j++) { 
     std::cout << canvas[i][j]; 
    } 
    std::cout << std::endl; 
}