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;
}

现在我想从字符数组中删除所有行尾。在不先将字符数组转换为字符串的情况下如何做到这一点?

顺便提一句。这是我们不允许使用字符串库的家庭作业的一部分。

4

4 回答 4

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

对于一些 C++11 lambda 乐趣:

#include <algorithm>
size = std::remove_if(pData, pData + size, [](char c) { return c == '\n'; }) - pData;
pData[size] = 0; // optional
于 2012-05-07T23:22:52.273 回答
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);

这里的额外好处是因为你调用而不是 malloc 数组,所有值最初都是零,所以在这种情况下,一旦你完成复制,从 (len-nlCount) 到 (len) 的数据将全部为零(即:'\0'),因此它会自动以空值结尾,就像字符串一样。完成后不要忘记释放()数组。

于 2012-05-07T23:19:08.183 回答
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';
}
于 2012-05-07T23:23:34.533 回答
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; 
    }
} 
于 2012-05-08T00:30:47.757 回答