Member 13933893 Ответов: 1

Как я могу принимать входные данные от пользователя с помощью системного вызова read и хранить их в файле с помощью системного вызова write. В C


Я уже был на форуме и ищу дополнительную помощь.

Йохен помогал мне , однако я не слежу за некоторыми вещами.

Я был бы рад, если бы кто-то просто помог мне узнать, является ли код, который у меня есть, правильным или нет

Если это неправильно, то какая именно модификация должна быть сделана?

Что я уже пробовал:

#define USERNAME_SIZE 10

int main()
{
	
	int fd;
	
	fd = fd("user.dat", O_CREAT | O_RWDR, 0666);
	if (fd == -1)
	{
		write(1,"There is an error opening the file",35);
	}
	
	write(1,"Enter the username",18);
	
	
  char username[USERNAME_SIZE];
  char c;
  int count = 0;
   do
    {
    read(0, &c, 1);
    if (c == '\n')
   break;
    username[count++] = c;
    }
   while (count < USERNAME_SIZE - 1);
    username[count] = 0;
	
	write(fd,username,count);
	
	close(fd);
	
	return 0;
}

1 Ответов

Рейтинг:
2

Richard MacCutchan

Почему вы используете низкий уровень read чтобы получить пользовательский ввод? Использовать системный вызов, как gets_s, _getws_s[^] который читает полную строку.

Кроме того, вы не объяснили, что не так с вашей программой.


Member 13933893

@Richard-MacCutchan, я пытаюсь скомпилировать это в shellforge, который не позволяет использовать внешние библиотеки C.

Я новичок в системных вызовах C и поэтому не знал, как это сделать.
Я считаю, что gets требует внешней библиотеки, если я не ошибаюсь.

Я не уверен, что написанная программа верна или нет, это моя забота.

Я хочу прочитать имя пользователя и пароль и сохранить их в файле.

Не могли бы вы подсказать мне, будет ли то, что я сделал, работать для записи в файл или если gets_s можно использовать без библиотечного файла .

Richard MacCutchan

Я понятия не имею, что такое шеллфордж.

Однако, насколько я вижу, единственная проблема, которая у вас есть, заключается в следующей строке:

fd = fd("user.dat", O_CREAT | O_RWDR, 0666);

Вы набрали fd( ... вместо open(. Так и должно быть:

fd = open("user.dat", O_CREAT | O_RWDR, 0666);

Member 13933893

@Richard-MacCutchan. Спасибо за поправку.

Я исправил свой код и теперь он выглядит следующим образом:



#определить O_RDWR 0x0002
#определить O_CREAT 0x0100
#define USERNAME_SIZE 10

тап_п()
{

int fd;

fd = open("user.dat", O_CREAT | O_RWDR, 0666);
если (fd == -1)
{
напишите(1,"есть ошибка открытия файла",35);
}

напишите(1,"введите имя пользователя",18);


char username[USERNAME_SIZE];
чар с;
int count = 0;
делать
{
читать(0, &c, 1);
если (c == '\n')
перерыв;
имя пользователя[count++] = c;
}
while (count < USERNAME_SIZE - 1);
имя пользователя[count] = 0;

писать(ФД,имя пользователя граф);

закрыть(fd);

возвращает 0;
}



-----Однако при запуске я получаю сообщение об ошибке, говорящее, что произошла ошибка при открытии файла ( я предполагаю, что файл не создается. )Что именно я должен делать в этом случае?
Если файл присутствует, то код работает нормально.

Richard MacCutchan

Ваше сообщение об ошибке не содержит достаточной информации. Когда я запускаю код в своей системе, он работает независимо от того, присутствует файл или нет, поэтому я не могу догадаться, в чем заключается ваша ошибка.

Member 13933893

@Richard-MacCutchan.

Спасибо за ваше руководство. Теперь мне удалось запустить программу .

Не могли бы вы помочь мне или направить меня, как сравнить 2 строки без использования функции strcmp?

Richard MacCutchan

Это довольно простое упражнение по сравнению отдельных персонажей. Но мой общий совет состоял бы в том, чтобы заполучить хороший справочник по языку Си или следовать некоторым онлайн-учебникам (см. learn C - поиск в Google[^Вопросы CodeProject-не самое лучшее место, если вы новичок, пытающийся выучить язык.

Richard MacCutchan

Я только что погуглил shellforge, и он выглядит как очень старый (и странный) продукт. Я предлагаю вам перейти к более позднему компилятору. Visual Studio Community Edition от Microsoft включает в себя компилятор C/C++ и доступен бесплатно. И GNU gcc/g++ также свободен.