Чтение файла с помощью 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) или ваш текстовый редактор по вашему выбору.

Другие вопросы по тегам