3

私は UPC を学び始めており、ファイルを読み取るための次のコードがあります。

upc_file_t *fileIn;
int n;
fileIn = upc_all_fopen("input_small", UPC_RDONLY | UPC_INDIVIDUAL_FP , 0, NULL);
upc_all_fread_local(fileIn, &n, sizeof(int), 1, UPC_IN_ALLSYNC | UPC_OUT_ALLSYNC);

upc_barrier;
printf("%d\n", n);

upc_all_fclose(fileIn);

ただし、出力 (n の値) は常に 808651319 であり、これは何かが間違っていることを意味し、それが何かを見つけることができません。入力として与えているファイルの最初の行は '7' なので、結果はprintf7 になるはずです...

なぜこれが起こるのか分かりますか?

前もって感謝します!

4

1 に答える 1

4

UPC パラレル I/O ライブラリは、標準 C ライブラリの(f)printf(3)/で得られるようなフォーマットされた入出力ではなく、フォーマットされていない (バイナリ) 入出力を実行します。(f)scanf(3)並列 I/O は、可変長レコードのような固有のプロパティがあるため、テキスト ファイルを処理できません。

upc_all_fread_local(fileIn, &n, sizeof(int), 1, UPC_IN_ALLSYNC | UPC_OUT_ALLSYNC)

ファイルからフォーマットなしで読み取るための標準 C ライブラリ関数への次の呼び出しのように動作します。

fread(&n, sizeof(int), 1, fh)

ファイルからバイトの 1 要素sizeof(int)(ほとんどのプラットフォームでは 4 バイト) を のアドレスに読み取っているだけですn80865131916 進数で取得した数値は です0x30330A37。x86/x64 のようなリトル エンディアン システムでは、これは0x37 0x0A 0x33 0x30(逆バイト順) としてメモリとディスクに保存されます。これらは文字列の最初の 4 バイトの ASCII コード7\n30(または LF は改行/改行記号) であるため、ファイルは次のよう\nになっていると思います。input_small

7
30...
...

または選択したテキスト エディタを使用する代わりに、バイナリ形式で入力データを準備する必要があります。fwrite(3)(f)printf(3)

于 2012-07-06T11:08:16.077 に答える