Как прочитать из входного файла и сохранить определенные части каждой строки и вывести его в командную строку? - PullRequest
0 голосов
/ 09 февраля 2019

Это код C, который у меня есть.Я читаю имя и фамилию из входного файла, но проблема в том, что мне нужно распечатать другие вещи.

Мне нужно взять строку, подобную этой:

Венера Дженсен 33770530841 vbjensen@oqtu.edu FRNO 624-771-4676 SIJ SBE WHV TVW

и удалите лишние вещи, чтобы сделать это так:

vbjensen Venus Jensen (624)771-4676

Моя проблема в том, что я получаю правильный вывод, но для некоторых строк, которые (1) не имеют FRNO или что-то эквивалентное и (2) не имеют символа @, строка по-прежнему отображается,Например, строки:

Noe Richard 974927158 nirichar@bvu.edu 079-651-3667 HAVQ

Филипп Сандовал 836145561 pusandov # luu.edu OXRU 697-728-1807 LHPN GUX

Эти строки печатать не следует, поскольку первая не имеет эквивалента FRNO, а вторая - символа @.Каждый раз, когда я пытаюсь добавить операцию форматирования для соответствия, но не для сохранения, функция sscanf программы начинает портиться.

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

   int main()
   {

    // Open the input file and print an error message if we're unsuccessful.
   // (the error message is mostly to help you with debugging.  We won't test
     // this behavior).
     FILE *fp = fopen("input.txt", "r");
      char line[500];
      if(!fp) {

       printf("Can't open input file\n");

      exit(1);
      }

      // Counting input lines, so we can report errors.


     // Keep reading input lines until we reach the end-of-file.
    // Write an output line or an error message for each one.
    do {
      int lineCount = 1;

              char fName[12];
              char lName[12];
             //char skipNum[12];
             char email[9];
            //char firstNum[4];
           //char secondNum[4];
          //char thirdNum[5];
         //printf("%c", ch);

         char phone[] = "(123)123-1234";

        //fscanf(fp, "%s", fName);

       //fscanf(fp, "%s", lName);

      //fscanf(fp, "%[1-9]", skipNum);

      //fscanf(fp, "%[a-z]", email);      



      sscanf (line, "%11s%11s%*[ 0-9]%9[^@]%*[^0-9]%3c-%3c-%4c", lName,   fName, email, &phone[1], &phone[5], &phone[9]);

         //printf("Invalid line");
        //printf("\n");

       // exit(1);

       printf("%s", line);

       printf("\n");

       printf("%s", email);
       printf("%s", fName);
       printf("%s", lName);
      //printf("%s", skipNum);
     //printf("%s", firstNum);

     printf("%s", phone);



    printf("\n");

  lineCount++;
} 
 while (fgets(line, sizeof line, fp));

     return EXIT_SUCCESS;
 }

1 Ответ

0 голосов
/ 10 февраля 2019

В строке формата "%20s%20s%*[ 0-9]%20[^@]@%*s%20s %3c-%3c-%4c"
%20s будет сканироваться до 20 непробельных символов.Игнорирование начальных пробелов и остановка на пробелах.
%*[ 0-9] будет сканировать пробелы и цифры.Звездочка * указывает sscanf отбросить отсканированные символы.
%20[^@]@ отсканирует до 20 символов или прекратит сканирование при значении @.Затем он попытается отсканировать @.Если @ отсутствует, сканирование прекращается досрочно.
%*s сканирует непробельные символы и удаляет символы.
%20s сканирует до 20 непробельных символов.
%3c будет игнорировать все начальные пробелы и сканировать три символа.
-%3c будет сканировать -, а затем три символа.Если - отсутствует, сканирование прекращается досрочно.
-%4c будет сканировать -, а затем четыре символа.Если - отсутствует, сканирование прекращается досрочно.
Если sscanf не сканирует семь элементов, ничего не будет напечатано.

#include <stdio.h>
#include <stdlib.h>
int main ( void) {
    char line[500] = "";
    int lineCount = 0;
    FILE *fp = NULL;

    if ( NULL == ( fp = fopen("input.txt", "r"))) {
        fprintf( stderr, "Can't open input file\n");
        exit(1);
    }

    while ( fgets ( line, sizeof line, fp)) {//read each line from the file
        char fName[21];
        char lName[21];
        char match[21];
        char email[21];
        char phone[] = "(123)567-9012";

        lineCount++;
        if ( 7 == sscanf ( line, "%20s%20s%*[ 0-9]%20[^@]@%*s%20s %3c-%3c-%4c"
        , lName, fName, email, match, &phone[1], &phone[5], &phone[9])) {
            printf ( "line [%d] %s %s %s %s\n", lineCount, email, fName, lName, phone);
        }
    }
    fclose ( fp);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...