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',所以结果printf应该是 7...

知道为什么会这样吗?

提前致谢!

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)

您只是sizeof(int)从文件中读取 1 个字节元素(在大多数平台上为 4 个字节)到n. 你得到808651319的十六进制数是0x30330A37. 在像 x86/x64 这样的小端系统上,它以0x37 0x0A 0x33 0x30(反转字节顺序)存储在内存和磁盘上。这些是字符串的前 4 个字节的 ASCII 代码7\n30\n或 LF 是换行符/换行符)所以我猜你的input_small文件看起来像:

7
30...
...

您应该使用而不是使用或您选择的文本编辑器来准备二进制格式的输入数据。fwrite(3)(f)printf(3)

于 2012-07-06T11:08:16.077 回答