#c #loops
#c #циклы
Вопрос:
Я хотел бы объединить содержимое из 2 файлов. но я не могу этого сделать.
Мой вывод выглядит так
Username: admin
Password: password123
Username: admin
Password: password456
Username: admin
Password: password789
Username: admin
Password: p@ssw0rd
Username: admin123
Password: password123
Но я хотел бы сделать такой вывод
Username: admin
Password: password123
Username: admin
Password: password456
Username: admin
Password: password789
Username: admin
Password: p@ssw0rd
Username: admin123
Password: password123
Username: admin123
Password: password456
Username: admin123
Password: password789
Username: admin123
Password: p@ssw0rd
Код выглядит следующим образом:
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
FILE *fpUser, *fpPass;
char user[100], pass[100];
fpUser = fopen("username.txt","r");
fpPass = fopen("password.txt","r");
if (fpUser==NULL || fpPass==NULL)
{
printf("Username or Password File Cannot Foundn");
exit(0);
} else {
while(fgets(user , 100 , fpUser) != NULL)
{
do
{
printf("Username: %sn", user);
printf("Password: %sn", pass);
}
while (fgets(pass , 100 , fpPass) != NULL);
}
}
return 0;
}
Комментарии:
1. Внутренний цикл вообще не должен работать, поскольку вы печатаете
pass
перед чтениемpass
из файла. Внутренний цикл должен бытьwhile
циклом, как и внешний цикл. Затем вам понадобитсяrewind
файл после завершения внутреннего цикла.2. что вы имеете в виду под
Combine content from 2 files
этим ? Вы хотите поставить одно за другим или ….3. Это действительно зависит от того, что содержат ваши 2 файла. Как вы планируете проверять свои результаты чтения? по строке? (например, строка 1 файла 1 совпадает со строкой 2 файла 2?) Возможны ли посторонние пустые строки?
4. @Garry это комментарий в сторону, но хранение паролей в файлах всегда возвращается, чтобы укусить одного сзади. Если вам нужна простая база данных паролей, возьмите хэш введенного пароля и сохраните его в файле. Затем, чтобы бросить вызов пользователю, запросите пароль и преобразуйте его в хэш, используя те же значения (и сравните, совпадают ли хэши). Гораздо сложнее подобрать пароль, который сделает хэши равными. (Этот совет не является надежной защитой от ошибок, но он намного лучше, чем сохраненные пароли).
5. на самом деле я хочу объединить содержимое из нескольких в несколько. например: распечатать пользователя A объединить все пароли, пользователя B объединить все пароли и т. Д.
Ответ №1:
Вам нужно переосмыслить свой цикл. Я думаю, вы хотите что-то вроде этого:
while((fgets(user , 100 , fpUser) != NULL) amp;amp;
(fgets(pass , 100 , fpPass) != NULL))
{
printf("Username: %s", user);
printf("Password: %sn", pass);
}
}
return 0;
}
Учитывая файлы username.txt
:
admin
admin
admin123
admin123
user1
user2
user3
и password.txt
:
password
badmin
x_234$yz00o@
n@@dles
p1ckL3z
sandW1ch3z
с новым циклом программа выводит:
Username: admin
Password: password
Username: admin
Password: badmin
Username: admin123
Password: x_234$yz00o@
Username: admin123
Password: n@@dles
Username: user1
Password: p1ckL3z
Username: user2
Password: sandW1ch3z
Обратите внимание, что я удалил новую строку из первого вызова printf()
, поскольку fgets()
считывает новую строку и сохраняет ее. Также обратите внимание, что программа просто останавливается, когда у нее заканчиваются пароли или имена пользователей.
Обновить:
@David C. Rankin предположил, что код должен обрабатывать пустые строки во входных данных. Это действительно хорошая идея, которая была у меня в голове, прежде чем он упомянул об этом, но я был слишком ленив, чтобы по-настоящему обдумать эту идею. Вот модифицированная версия всей программы, которая выполняет это. Я добавил два указателя на char
в объявлениях, чтобы получать возвращаемые значения из вызовов fgets()
.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
FILE *fpUser, *fpPass;
char *isUser, *isPass;
char user[100], pass[100];
fpUser = fopen("username.txt","r");
fpPass = fopen("password.txt","r");
if (fpUser==NULL || fpPass==NULL)
{
printf("Username or Password File Cannot Foundn");
exit(0);
} else do {
while ((isUser = fgets(user, 100, fpUser)) != NULL amp;amp;
user[0] == 'n')
continue;
while ((isPass = fgets(pass, 100, fpPass)) != NULL amp;amp;
pass[0] == 'n')
continue;
if (isUser amp;amp; isPass) {
printf("Username: %s", user);
printf("Password: %sn", pass);
}
} while (isUser amp;amp; isPass);
return 0;
}
Вот файлы username.txt
:
admin
admin
admin123
admin123
user1
user2
user3
и password.txt
:
password
badmin
x_234$yz00o@
n@@dles
p1ckL3z
sandW1ch3z
anotherpass
longforapass
Вы не можете увидеть это здесь, но password.txt
файл начинался с пустой строки. Вот новый результат:
Username: admin
Password: password
Username: admin
Password: badmin
Username: admin123
Password: x_234$yz00o@
Username: admin123
Password: n@@dles
Username: user1
Password: p1ckL3z
Username: user2
Password: sandW1ch3z
Username: user3
Password: anotherpass
Комментарии:
1. Может быть, an
if (*user != 'n' amp;amp; *pass != 'n') { /* then consider OK */ }
?2. @DavidC.Rankin — хорошая мысль. Смотрите Обновление моего ответа. Я не уверен, что мое решение является самым чистым. Может быть, у вас есть другая идея?
3. Да, это намного лучше. Вы просматриваете вперед по пустым лайкам, также работает. Это должно сделать это для этого Q.
Ответ №2:
Почтальон, вы можете закрыть это дело. я нашел ответ, который использует rewind() во внутреннем цикле.