-1

これは簡単なはずのようです。それが私を特に狂気に駆り立てている理由です。うまくいけば、そこにいる誰かが問題をすぐに見るでしょう。ユーザー入力から構築された配列から配列を構築しようとしています。私が意図したものよりも大きい配列を作成しているようです。プログラムは次のとおりです。

    int main()
{

  ifstream inFile;
  ofstream outFile;

  int numReq, fileSize;
  string lang, dash;

  char fileName[40];
  char confirm[10];
  char confirm2[10];
  int character;
  char year[3];
  char month[1];
  char day[1];
  char hour[1];


  cout << "What file to process?" << endl;
  cin >> fileName;

  year[0] = fileName[14];
  year[1] = fileName[15];
  year[2] = fileName[16];
  year[3] = fileName[17];

  cout << "year = " << year << "." << endl;

  month[0] = fileName[18];
  month[1] = fileName[19];

  cout << "month = " << month << "." << endl;
  cout << "so I gotta know, what is..." << endl;
  cout << "month[0]? " << month[0] << endl;
  cout << "month[1]? " << month[1] << endl;
  cout << "month[2]? " << month[2] << endl;
  cout << "month[3]? " << month[3] << endl;
  cout << "month[4]? " << month[4] << endl;
  cout << "month[5]? " << month[5] << endl;
  cout << "month[6]? " << month[6] << endl;


  day[0] = fileName[20];
  day[1] = fileName[21];

      cout << "day = " << day << "." << endl;

  hour[0] = fileName[23];
  hour[1] = fileName[24];

  cout << "hour = " << hour << "." << endl;

  cout << "so, 'fileName[23]' is = " << fileName[23] << "?" << endl;
  cin >> confirm;

  cout << "So, the year is " << year << ", the month is " << month
       << ", the day is " << day << ", the hour is " << hour << "?" << endl;
  cin >> confirm;

  //cout << "Is this what you chose? " << fileName << endl;                           
  //cin >> confirm;                                                                   
  //cout << "Which character to manipulate?" << endl;                                 
  //cin >> character;                                                                 

  //cout << "This one? " << fileName[character] << endl;                              
  //cin >> confirm2;                                                                  

  inFile.open(fileName);
  assert (!inFile.fail());


  outFile.open("revisedPracticeFile1.txt");

  outFile << fixed << showpoint; // I have no idea what this is...                    
  outFile << setprecision(2);    // .. or this for that matter.                       

  cout << "Processing data" << endl;

  inFile >> lang;

  while (!inFile.eof() ){
    if (lang.length() <= 2){

      outFile << lang << " ";


      // I should keep in mind, that, for whatever reason, it seemed like the         
      //item 'setw(6)' made the program work when I put it in, but didn't seem        
      //to make the program stop working when I took it out. Curious..                

      inFile >> dash >> numReq >> fileSize;

      outFile << numReq << " " << fileSize << endl;

    }
    else{
      inFile >> dash >> numReq >> fileSize;
          cout << "took out " << lang << " " << numReq << " " << fileSize << endl;
    }

    inFile >> lang;
  }
  inFile.close();
  //assert(!inFile.fail());                                                           
  outFile.close();

  return 0;
}

...そして、これは私がプログラムを実行したときに起こることです:

    What file to process?
projectcounts-20090101-010000                                      
year = 2009.
month = 01009.
so I gotta know, what is...
month[0]? 0
month[1]? 1
month[2]? 0
month[3]? 0
month[4]? 9
month[5]? 
month[6]? 
day = 011009.
hour = 0111009.
so, 'fileName[23]' is = 0?
yes
So, the year is 1009, the month is 11009, the day is 111009, the hour is 0111009?
^C

...では、何が得られるのでしょうか。

4

1 に答える 1

2

構文char year[3];は、3つの要素を持つ配列を宣言します。ただし、これを使用して4つの要素を格納します。他のアレイにも同様の問題があります。

また、文字列としてchar配列を使用しています。これは、C(C ++ではない)の方法です。もちろん、必要に応じてこれを行うことができます。ただし、これらのcスタイルの文字列は、最後の項目がゼロであるという規則を使用しています。

したがって、Cスタイルの文字列で作業'foo'を格納する場合は、次のように実行できます。

char string[10];  // anything bigger than 3 works
string[0] = 'f';
string[1] = 'o';
string[2] = 'o';
string[3] = '\0';  // this zero tells functions like `printf` that the string has ended.

最後のゼロがないと、のような関数printfは、どこかでゼロが発生するまでメモリ位置を出力し続けます。

編集:文字列処理にc ++ std::stringを使用することを検討してください。

于 2012-10-15T00:02:08.513 に答える