2016-06-25 3 views
1

Этот код представляет собой небольшой опыт обучения о I/O Файл, который я не могу до конца закончить еще:Как искать конкретные строки и целые числа в файле .txt C и использовать их?

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 

int main() 
{ 
    FILE *fP; 

    char so_name[64]; 
    char user_name[64]; 
    int number; 
    char continue_button; 

    time_t t; 

    system("TITLE Love-0-meter"); 
    system("COLOR 4D"); 

    srand((unsigned) time(&t)); 
    number = (rand() %100); 

    printf("Hi and welcome to the love-o-meter, please fill in the details and see how much you and your SO" 
     " love each other!\n\nHave you used this program before?(Y/N)"); 
    do 
    { 
     scanf(" %c", &continue_button); 

    }while(continue_button != 'n' && continue_button != 'N' && continue_button != 'Y' && continue_button != 'y'); 

    system("CLS"); 
    printf("Enter your SO's name: "); 
    scanf(" %s", so_name); 
    printf("Enter your name: "); 
    scanf(" %s", user_name); 
    printf("\n%s and %s, you love each other %d%%", so_name, user_name, number); 

    if(continue_button == 'N' || continue_button == 'n') 
    { 
     fP = fopen("Love-o-meter.txt", "w"); 
    } 
    else 
    { 
     fP = fopen("Love-o-meter.txt", "a"); 
    } 
    fprintf(fP, "%s %s %i\n", so_name, user_name, number); 
    fclose(fP); 

    return 0; 
} 

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

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

ответ

0

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

Вы уже правильно описали, что необходимо сделать. Для того, чтобы сделать это, вы должны

  • открыть файл в режиме, который позволяет читать (a+ вместо a)
  • читать сохраненные имена и числа е. г. с fscanf()
  • сравнить их с введенными именами с strcmp()
  • назначить сохраненный номер, если имена совпадают

- так изменить

printf("\n%s and %s, you love each other %d%%", so_name, user_name, number); 

    if(continue_button == 'N' || continue_button == 'n') 
    { 
     fP = fopen("Love-o-meter.txt", "w"); 
    } 
    else 
    { 
     fP = fopen("Love-o-meter.txt", "a"); 
    } 
    fprintf(fP, "%s %s %i\n", so_name, user_name, number); 

в

if(continue_button == 'N' || continue_button == 'n') 
    { 
     fP = fopen("Love-o-meter.txt", "w"); 
    } 
    else 
    { 
     char so_used[64]; 
     char user_used[64]; 
     int nuused; 
     fP = fopen("Love-o-meter.txt", "a+"); // append + read 
     while (fscanf(fP, "%s %s %i\n", so_used, user_used, &nuused) == 3) 
      if (!strcmp(so_used, so_name) && !strcmp(user_used, user_name)) 
      { 
       number = nuused; 
       goto out; 
      } 
    } 
    fprintf(fP, "%s %s %i\n", so_name, user_name, number); 
out: 
    printf("%s and %s, you love each other %d%%\n", so_name, user_name, number); 
0

Вы можете сохранить свою позицию в файле, отсканировать ее с начала и затем вернуться в сохраненную позицию.

char name1[256], name2[256]; 
int val; 
size_t pos = ftell(fP); 
rewind(fP); 
while(fscanf(fp, "%s %s %d", name1, name2, &val) == 3) { 
    // compare everything you need 
} 
fseek(fP, pos, SEEK_SET) 

Я надеюсь, что я понял Вас правильно :)

0

То, что вы хотите сделать, это разобрать файл. Чтобы сделать это со строками в текстовом файле, вам нужно каким-то образом узнать, где искать имена и результаты, хранящиеся для имен.

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

Далее, вы, вероятно, должны прочитать некоторые сведения о документации «fopen», например. this

Я надеюсь, что это было то, что вы искали.

Смежные вопросы