Чтение файла с помощью UPC
Я начинаю изучать 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...
Есть идеи, почему это происходит?
Заранее спасибо!
1 ответ
Библиотека параллельного ввода / вывода UPC выполняет неформатированный (двоичный) ввод / вывод, а не форматированный, как то, что вы получаете с (f)printf(3)
/(f)scanf(3)
из стандартной библиотеки C. Параллельный ввод / вывод не может обрабатывать текстовые файлы из-за их внутренних свойств, таких как записи переменной длины.
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
(обратный порядок байтов). Это коды ASCII первых 4 байтов строки 7\n30
(\n
или LF - символ перевода строки / новой строки) input_small
файл выглядел так:
7
30...
...
Вы должны подготовить свои входные данные в двоичном формате, используя fwrite(3)
Вместо того, чтобы использовать (f)printf(3)
или ваш текстовый редактор по вашему выбору.