2012-05-07 96 views
2

我已經使用這個功能把文件中的內容在字符數組:如何從char數組中刪除換行符?

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函數閱讀文件,爲什麼你不想使用字符串類來處理嚴格g數據? –

+0

你是什麼意思「帶」?你是否想將整個數組複製到其他地方去除換行符或用其他字符替換換行符? – Duck

+0

@Duck我認爲OP不想複製操作 – johnathon

回答

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

對於一些C++ 11的λ樂趣:

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

這裏的好處是,因爲你calloc'ed而不是malloc'ing你的陣列,所有的值都是零開始,所以在這種情況下,一旦你完成拷貝,在數據(LEN-nlCount)到(len)將全部爲零(即:'\ 0'),所以它自動以null結尾,就像字符串一樣。當你完成後,不要忘記釋放()數組。

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

哎呀我把那裏的大小,當我要做一個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; 
    } 
}