1

Oracle のVirtualBoxを使用して、仮想マシンのLubuntuでこれを実行しています。それが何かに影響するとは思いませんが、言及する価値があると思いました。

次の関数によって返される文字列の末尾に追加された奇妙な記号からエラーが表示されているようです。

inline std::string f_settings_get(std::string val){
    int index=0;
    while(strcmp(val.c_str(),f_settings[0][index].c_str())!=0){
        index++;
    };
    // For debugging purposes - printf("\n%s\t%s",f_settings[0][index].c_str(),f_settings[1][index].c_str());
    return f_settings[1][index];
}

この関数に問題は見られないため、変数に格納されているデータが原因である可能性があります。

を使用してプログラムでファイルを開こうとしfopenましたが、タイトルに記載されているエラーに遭遇しました。コードは Windows で完全に動作します (そして、各オペレーティング システムの/とを説明しました)。\ただし、Linux で実行すると、完全にコンパイルされますが、ファイルが存在しないというエラーが発生します。オンラインで確認したところ、他の人が抱えていた次のような問題がいくつか見つかりました。

  1. ファイル名は本当に正しいファイル名ではありません

  2. ファイルへのアクセス許可がありませんでした

  3. ファイルへのアクセスは、ディレクトリ全体ではなく「file.txt」を呼び出すだけで行われました

提供されたPythonスクリプトを使用して最初のファイルをチェックアウトし、新しい名前でファイルを再作成しました。それは機能しませんでした (そして、Python スクリプトはファイル名が適切であることを示しました)。

すべてのアクセス許可を 777 に設定しましたがchmod -R 777 clesis、うまくいきませんでした (ただし、ファイルが存在しないと言われたため、アクセス許可の問題であるとは予想していませんでした)。

完全なパスが既に呼び出されており、パスを再確認しました。正しいです。

最後に、次のコードを実行して、(a) ファイルが存在すること、(b) 正しいファイルを開こうとしたことを再確認しました。

    tmp_s="";
    tmp_s = homeDir+binP+f_settings_get("xxxxx"); // Note, you can easily get whatever variable you want using either f_settings_get or num_settings_get
    tmp_file = fopen(tmp_s.c_str(), "r+");
    printf("\n Running the following command: /home/xxxxx/programming/xxxxx/bin\n");
    std::system("ls -l /home/xxxxx/programming/xxxxx/bin");
    getWait();
    printf("\n Tried to open: %s", tmp_s.c_str());
    if (tmp_file == NULL){
        printf("\n");
        perror("Error loading dimensions.sim");
        printf("Press enter to exit...");
        getWait();
        exit(1);
    }

そして、出力は次のようになります(検閲して申し訳ありません。ユーザー名とフォルダーのスペルが同じであることを保証します):

出力は次のとおりです。

Filenames Loaded...

Loading Settings from sim file...
++++++++++++++++++++++++++++++++++++++++++++++++++ Settings Loaded...

Loading System Dimensions from sys file...
--------------------------------------------------
 Running the following command: /home/xxxxx/programming/xxxxx/bin
total 636
-rwxrwxrwx 1 xxxxx xxxxx    958 Jul 25 20:59 dimensions.sim

Tried to open: /home/xxxxx/programming/xxxxx/bin/dimensions.sim

Error loading dimensions.sim: No such file or directory
Press enter to exit...

ファイル パスが「bin/dimensions.sim」または「/home/xxxxx/programming/xxxxx/bin/dimensions.sim」として直接指定されている場合、正しく動作します。これは私を混乱した結論に導きます。tmp_sa から astd::stringへの変換のどこかでc_str、間違ったディレクトリ パスにつながる問題があります。ただし、これは私が使用している他のファイルでは発生せず、Windows マシンでこの問題が発生したことはありません。したがって、私はそれを引き起こしている可能性があるものについて混乱しています。

最後にもう 1 つ観察します。とにかく、変換はprintf("tmps = %s",tmp_s.c_str());. そして、それは「変」ではないことがはっきりとわかります。

4

1 に答える 1

4

あなたの問題はおそらく、 unix-y ライブラリを使用して windows-y ファイルを読み取るときに一般的な、迷走改行 (hex 0D、通常\rは C のように記述) から発生しています。Windows ファイルの行は CR-LF hex0D0Aで終了しますが、UNIX では単一の LF hex のみを使用し0Aます。\nWindows C stdio は、バイナリ モードで開かれていないファイルの CRLF を単一の LF ( ) にマップします。Unix では、再マッピングが行われないため、ファイルをバイナリ モードで開くか ASCII モードで開くかは問題ではありません。

その結果、Windows プログラムでコンパイルされた同じプログラムが Windows ファイルを読み取ることができ、Unix 上でコンパイルされた同じプログラムが Unix ファイルを読み取ることができます。どちらの場合も、行末記号は単一の\n. 通常、Windows プログラムは Unix ファイルも読み取ることができます。しかし、Windows ファイルを読み取る Unix プログラムは、各行の末尾にCR, \r, 16 進数が表示されます。0D

これは、特に構成ユーティリティを悩ませます。次の形式の構成ファイルがあるとします。

some_setting=27
some_file=dimensions.sim

ここで、構成リーダーは各行を読み取り、 で分割し=、最初の部分をキーとして、2 番目の部分を値として使用します。一部の値を数値に変換する場合もあります。

ここで、ファイルが Windows で作成された場合 (ファイルが現在 Windows 上にあるかラップトップ上にあるかに関係なく)、Unix 構成リーダーは as の値と as の値を確認some_settingします。最初のものは、構成システムが偏執的でない限り、問題を引き起こしません。最初の非数字文字まで変換し、少なくとも1つの数字がある限り文句を言わないからです。ただし、ファイル名の末尾に a がある可能性は低いため、文字列はファイル名として機能しません。27\rsome_filedimensions.sim\ratoistrtod\r

この問題を特に厄介なものにしているのは、問題のある文字列を出力しようとすると、\r実際にはキャリッジ リターンとして機能することです。つまり、カーソルを行頭に戻します。次の出力文字が\nの場合、\rはまったく見えません。次の出力がなんらかのメッセージである場合、行にオーバープリントされ、非常に混乱します。

于 2013-07-26T02:53:49.370 に答える