我开始学习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…
知道为什么会这样吗?
提前感谢!
发布于 2012-07-06 19:08:16
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个字节)读取到n的地址中。您得到的十六进制808651319的数字是0x30330A37。在像x86/x64这样的小端系统上,它以0x37 0x0A 0x33 0x30 (颠倒字节顺序)的形式存储在内存和磁盘中。以下是字符串7\n30的前4个字节的ASCII码(\n或LF是换行符/换行符),所以我猜您的input_small文件如下所示:
7
30...
...您应该使用fwrite(3)准备二进制格式的输入数据,而不是使用(f)printf(3)或您选择的文本编辑器。
https://stackoverflow.com/questions/11355194
复制相似问题