2

この関数を使用して、ファイルの内容をchar-arrayに入れました。

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-arrayからすべての行末を削除します。最初にchar-arrayを文字列にキャストせずにこれを行うにはどうすればよいですか?

ところで。これは、文字列ライブラリの使用が許可されていない宿題の一部です。

4

4 に答える 4

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
于 2012-05-07T23:22:52.273 に答える
1

最も簡単な方法は、2番目のバッファーを元の配列のサイズにすることです。

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する代わりにcallocしたため、最初はすべての値がゼロであるため、この場合、コピーが完了すると、(len-nlCount)から(len)までのデータがすべてゼロ(つまり、'\ 0')であるため、文字列がとにかくそうであるように、自動的にnullで終了します。完了したら、配列をfree()することを忘れないでください。

于 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 に答える