我开始学习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 ...
知道为什么会这样吗?
提前致谢!
答案 0 :(得分: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
(反向字节顺序)存储在内存和磁盘上。这些是字符串7\n30
的前4个字节的ASCII码(\n
或LF是换行/换行符号)所以我猜你的input_small
文件看起来像:
7
30...
...
您应该使用fwrite(3)
而不是使用(f)printf(3)
或您选择的文本编辑器,以二进制格式准备输入数据。