2

この C++ コードを取得して、テキスト ファイルから一連の数値を入力しようとしています。

    int x = 0;
    cin >> x;

    ifstream iffer;
    int numbers[12];
    iffer.open("input.txt");
    for (int i = 0; i < 12; i++){
        iffer >> numbers[i];
    }

これは Mac では動作しないようです。テキスト ファイルの値に関係なく、すべてのセルは 0 になります。つまり、ifstream は番号を割り当てていません。

どうすればこれを機能させることができますか?これは Mac の問題ですか? もしそうなら、どうすれば動作させることができますか?

ありがとう!

アンソニー・グラチェンコ

4

5 に答える 5

2

たぶんファイルを開くのに失敗しましたか?
ifferのフェイルビットがfail()で設定されているかどうかを確認できます

if(iffer.fail())
{
  cout << "Failed to open file." << endl;
}
于 2010-03-16T00:54:38.497 に答える
1

動作するはずですが、「get」は常に 1 文字だけを読み取ることに注意してください。これは私が Mac OSX でもテストしたものですが、これは標準の C++ であるため、お使いの OS とは関係ありません。

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

int main(){
    ifstream iffer;
    iffer.open("input.txt");
    char numbers[12];
    int i = 0;
    while (iffer.good()){
        numbers[i] =  iffer.get();
        i++;
    }
    for (int n = 0; n < 8; n++){
        cout << numbers[n];
    }        
    cout << endl;
    iffer.close();
}

ファイル「input.txt」を読み込んでいます。このファイルが作業ディレクトリにあることを確認してください。:

12345678

ファイルを読み込んでいる間、すべての文字が配列に格納されます。したがって、次のようなファイルがある場合

1 2 3 4 5 6 

あなたの配列が含まれます

numbers[0] = '1'
numbers[1] = ' ' 
numbers[2] = '2'
numbers[3] = ' '
...
于 2010-03-16T01:33:34.737 に答える
1

試した (VC9.0):

#include <iostream>
#include <fstream>

int main()
{
    using namespace std;

    int x = 0;
    cin >> x;

    ifstream iffer;
    int numbers[12];
    iffer.open("input.txt");
    for (int i = 0; i < 12; i++){
        iffer >> numbers[i];
    }
    for (int i = 1; i < 12; i++){
        numbers[i] = i;
    }

    return 0;
}

それは機能しましたが、2 番目のループは間違っています。

于 2010-03-16T00:42:52.007 に答える
0

Linux(g ++ 3.4.4)Mac(g ++ 4.0.1)の両方で、少し変更したコードを試しましたが、問題なく動作します。

Chuckに関しては、input.txtが存在しない場合、iffer.fail()はtrueです。あなたがそうではないと言うので...

もう1つの可能性は、予想とは異なる input.txtファイルです。数値が少なすぎると、ゼロ(または他のガベージ値)が表示されます。( iffer.eof()でテストできますが、末尾に空白がない場合(改行など)、最後の数値を読み取った後に(適切に)設定される可能性があります。したがって、 読み取る前にeof()をテストしてください!)

または、コードの他の場所にダングリングポインターを設定して、何かを不適切に破棄することもできます。コードの大きなチャンクを追加および削除すると、そのような問題が実際にどこにあるかを手動で「バイナリ検索」できる場合があります。

#include <iostream>
#include <fstream>

using namespace std;

#define SHOW(X) cout << # X " = \"" << (X) << "\"" << endl

int main()
{
  int x = 0;
  cin >> x;

  ifstream iffer;
  int numbers[12];
  iffer.open("input.txt");
  SHOW( iffer.fail() );
  SHOW( iffer.eof() );
  for (int i = 0; i < 12; ++i)
  {
    SHOW(i);
    SHOW(numbers[i]);
    iffer >> numbers[i];
    SHOW(numbers[i]) << endl;
  }
  for (int i = 0; i < 12; ++i)
    SHOW(numbers[i]);
  SHOW( iffer.fail() );
  SHOW( iffer.eof() );
}
于 2010-03-16T02:10:27.690 に答える
0

これはパスの問題のように聞こえます。「input.txt」ファイルはどこかにありますが、現在のディレクトリにはありません。これが GUI アプリケーションの場合は、現在のディレクトリが多少予測できないことに注意してください。絶対パスまたは既知のパス (現在のアプリケーション CFBundle へのパスなど) からの相対パスを指定する必要があります。

テストのために、次のコードでラップされた正確なコードを含む Unix プログラムを作成しました。

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

int main() {
    int x = 0;
    // your code
    cout << numbers[5] << endl;
    return 0;
}

これはうまくいったので、これがコマンドライン プログラムであり、正しいディレクトリから起動した場合は、アプリのどこかで現在のディレクトリを変更している必要があります。

于 2010-03-16T01:47:49.183 に答える