16

.txt ファイル全体を char 配列にコピーしようとしています。私のコードは機能しますが、空白が除外されます。たとえば、.txt ファイルに「I Like Pie」と表示されていて、それを myArray にコピーした場合、for ループを使用して配列を計算すると、「ILikePie」が得られます。

これが私のコードです

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main () 
{
  int arraysize = 100000;
  char myArray[arraysize];
  char current_char;
  int num_characters = 0;
  int i = 0;

  ifstream myfile ("FileReadExample.cpp");

     if (myfile.is_open())
        {
          while ( !myfile.eof())
          {
                myfile >> myArray[i];
                i++;
                num_characters ++;
          }      

 for (int i = 0; i <= num_characters; i++)
      {

         cout << myArray[i];
      } 

      system("pause");
    }

助言がありますか?:/

4

5 に答える 5

48

myfile >> myArray[i]; 

ファイルを単語ごとに読み取っているため、スペースがスキップされます。

ファイル全体を文字列に読み込むことができます

std::ifstream in("FileReadExample.cpp");
std::string contents((std::istreambuf_iterator<char>(in)), 
    std::istreambuf_iterator<char>());

そして、contents.c_str()char配列を取得するために使用できます。

これがどのように機能するか

std::string範囲内の文字のシーケンスをコピーする範囲コンストラクターがあります [first,last)同じ順序でlast をコピーしないことに注意してください。

template <class InputIterator>
  string  (InputIterator first, InputIterator last);

std::istreambuf_iteratoriterator は、ストリーム バッファーから連続する要素を読み取る入力反復子です。

std::istreambuf_iterator<char>(in)

(ファイルの先頭) のイテレータを作成ifstream inし、コンストラクタにパラメータを渡さない場合は、ストリームの終わりのイテレータ (最後の位置) を作成します。

デフォルトで構築された std::istreambuf_iterator は、ストリームの終わりの反復子として知られています。有効な std::istreambuf_iterator が基になるストリームの末尾に到達すると、ストリームの末尾の反復子と等しくなります。それを逆参照またはインクリメントすると、未定義の動作がさらに発生します。

したがって、これは、ファイルの最初の文字から始まり、次の文字がストリームの終わりになるまで、すべての文字をコピーします。

于 2013-08-23T08:27:16.323 に答える
14

次のコード スニペットを使用します。

FILE *f = fopen("textfile.txt", "rb");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);

char *string = (char *)malloc(fsize + 1);
fread(string, fsize, 1, f);
fclose(f);

string[fsize] = 0;
于 2013-08-23T09:00:31.857 に答える
1

char 配列の使用に縛られている場合の簡単な解決策であり、コードへの変更は最小限です。以下のスニペットには、ファイルの末尾まですべてのスペースと改行が含まれます。

      while (!myfile.eof())
      {
            myfile.get(myArray[i]);
            i++;
            num_characters ++;
      }  
于 2015-06-06T01:44:40.090 に答える