Данные, хранящиеся в текстовом файле с использованием fwrite, не читаются в C - PullRequest
0 голосов
/ 14 мая 2018

Когда данные хранятся в текстовом файле с использованием fwrite, например, где t является структурой:

fwrite(&t, sizeof(t), 1, fptr);

Вывод в текстовом файле заканчивается как:

楷獬湯찀쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌쳌敷敷

(Выше приведен пример, а не полный вывод)

Почему это происходит?

Редактировать: t - это структура - где пользователю предлагается ввести две строки: имя пользователя и пароль.Вот базовый шаблон - у друга была проблема, и у меня нет фактического фрагмента кода, которым я мог бы поделиться, но я предполагаю, что это было что-то эквивалентное этому.Я знаю, что это не очень полезно, извините за это.Любая помощь приветствуется.

struct details {
char username[32], password[32];
}

int main() {
struct details t;
scanf("%s",t.username);
scanf("%s",t.password);
}

Файл открывается в режиме +.

Edit2: код друга друга, инициализированная структура с новым файлом, ввод имени пользователя и пароля в виде «0».Вот шестнадцатеричный дамп.

file name: admins.txt
mime type: 

0000-0010:  30 00 cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc  0....... ........
0000-0020:  cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc  ........ ........
0000-0030:  cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc  ........ ........
0000-0040:  cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc  ........ ........
0000-0050:  cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc  ........ ........
0000-0060:  30 00 cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc  0....... ........
0000-0070:  cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc  ........ ........
0000-0080:  cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc  ........ ........
0000-0090:  cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc  ........ ........
0000-00a0:  cc cc cc cc-cc cc cc cc-cc cc cc cc-cc cc cc cc  ........ ........

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Прочитать документацию fwrite . Это для двоичный файл IO. Но у вас есть текстовый формат.

Вы можете рассмотреть разбор вашего текстового файла. Узнайте о fgets , sscanf и т. Д. *

Также рассмотрите возможность использования существующих текстовых форматов, таких как JSON , YAML и т. Д. ... Вы найдете много библиотек для них (например, jansson в C) .

Поскольку вас интересуют (или вы наблюдаете) китайские иероглифы, прочитайте Utf8 Везде .

Кроме того, скомпилируйте свой код с помощью всех предупреждений и отладочной информации (например, gcc -Wall -Wextra -g с GCC ) и узнайте, как использовать отладчик gdb чтобы понять поведение вашей программы. Вы можете использовать watchpoints , чтобы понять, когда пишется местоположение.

Узнайте больше о неопределенном поведении и будьте напуганы (содержание нежелательного файла - это возможный эффект UB, но это может быть гораздо хуже) .

0 голосов
/ 14 мая 2018

Является ли введенный пользователем ввод Unicode-строкой? Инициализировать структуру для всех нулей. Вставьте hexdump файла.

...