2012-05-07 3 views
2

나는이 기능을 사용하여 문자 배열에있는 파일의 내용을 넣어했습니다문자 배열에서 줄 바꿈을 제거하는 방법은 무엇입니까?

void Read::readFile(){ 
FILE * fp = fopen(this->filename,"rt"); 
fseek(fp, 0, SEEK_END); 
long size = ftell(fp); 
fseek(fp, 0, SEEK_SET); 
char *pData = new char[size + 1]; 
fread(pData, sizeof(char), size, fp); 
fclose(fp); 
this->data = pData; 
} 

지금 나는 문자 배열의 모든 라인 엔딩을 제거하고자합니다. char 배열을 문자열로 변환하지 않고 먼저 어떻게해야합니까?

btw. 이것은 우리가 문자열 라이브러리를 사용할 수없는 숙제의 일부입니다.

+6

왜 당신이 사용하는 C 함수 일부 C++ 11 람다 재미에 대한 –

+0

"스트립"이란 무엇을 의미합니까? 새 배열을 뺀 다른 배열 전체를 복사하거나 개행 문자를 다른 문자로 바꾸시겠습니까? – Duck

+0

@Duck 나는 OP가 복사 작업을하지 않아도되기를 바란다고 생각한다. – johnathon

답변

8
#include <algorithm> 
size = std::remove(pData, pData + size, '\n') - pData; 
pData[size] = 0; // optional 

파일을 읽으 려하고 strin을 처리하기 위해 문자열 클래스를 사용하고 싶지 않은 이유는 무엇입니까? g 데이터?
+0

내 생각은 정확하게. 간단하고 현대적이며 효과적이고 효율적입니다. – chris

+0

단일 라이너 솔루션은 항상 최고의 IMO +1입니다. – EdChum

+0

다른 사람들이 본질적으로 단 하나의 라이너이기 때문에 보는 것보다 뛰어납니다. – chris

1

가장 쉬운 방법은 두 번째 버퍼를 원래 배열 크기로 만드는 것입니다.

int len = size; 

char* newBufer = calloc(len,sizeof(char)); 
int i = 0; 
int j = 0; 
int nlCount = 0; 

for(i=0; i<len; i++) { 
    if(pData[i] != '\n') { 
    newBuffer[j++] = pData[i]; 
    } else { 
    nlCount++; 
    } 
} 

printf("Finished copying array without newlines. Total newlines removed: %d",nlCount); 

여기에 추가 혜택은 모든 값이 경우에 그래서, 당신은에서 데이터를 복사 완료 후 (렌 - nlCount), 처음 제로인 당신이 calloc'ed 대신 배열을 malloc'ing 이후입니다 through (len)은 모두 0이 될 것입니다 (예 : '\ 0'). 자동으로 null로 끝나기 때문에 문자열이 어쨌든있을 것입니다. 완료되면 배열을 해제()하는 것을 잊지 마십시오.

#include <algorithm> 
size = std::remove_if(pData, pData + size, [](char c) { return c == '\n'; }) - pData; 
pData[size] = 0; // optional 
1

장소 제거에서 :이 같은

void strip_newlines(char* p) { 
    char* q = p; 
    while (p != 0 && *p != '\0') { 
     if (*p == '\n') { 
      p++; 
      *q = *p; 
     } 
     else { 
      *q++ = *p++; 
     } 
    } 
    *q = '\0'; 
} 
+0

쓸데없는'size' 인자 ... 그리고 만약 내장 된 NUL이 있다면? 또한 '\ n'다음에 오는 문자를 쓸모없이 여러 번 복사하고 문자열을 종료시키지 않거나 새로운 크기를 찾는 방법을 제공하지 않습니다. –

+0

oops for 루프를 수행 할 때 크기를 넣었습니다 ... 포인터로 전환 한 경우에만 제거됩니다. – Kevin

+0

while 루프가 완료되면 문자 배열 끝에 새 줄 문자를 추가하는 것을 잊지 마십시오. – Chisholm

0

뭔가 :

void Read::readFile() 
{ 
    FILE * fp = fopen(this->filename,"rt"); 
    if (fp) 
    { 
     char *pData = NULL; 

     fseek(fp, 0, SEEK_END); 
     long size = ftell(fp); 
     if (size != -1L) 
     { 
      pData = new char[size]; 
      if (size > 0) 
      { 
       fseek(fp, 0, SEEK_SET); 
       size = fread(pData, sizeof(char), size, fp); 
      } 
     } 
     fclose(fp); 

     if (size < 0) 
     { 
      delete[] pData; 
      pData = NULL; 
     } 
     else if (size > 0) 
     { 
      char *start = pData; 
      char *end = start + size; 

      char *ptr = (char*) memchr(pData, '\n', size); 
      while (ptr) 
      { 
       int len = 1; 
       if ((ptr > start) && ((*ptr-1) == '\r')) 
       { 
        --ptr; 
        ++len; 
       } 

       memmove(ptr, ptr+len, end - (ptr+len)); 
       end -= len; 

       ptr = (char*) memchr(ptr, '\n', end - ptr); 
      } 

      size = (end - start); 
     } 

     this->data = pData; 
     this->size = size; 
    } 
} 
관련 문제