1. We have moved from vBulletin to XenForo and you are viewing the site in the middle of the move. Though the functional aspect of everything is working fine, we are still working on other changes including the new design on Xenforo.
    Dismiss Notice

HOW to use "\r" properly?

Discussion in 'C' started by jose_peeterson, Jun 20, 2012.

  1. jose_peeterson

    jose_peeterson New Member

    Hello everyone,

    I have a problem!. I am writing a code for a library program. i am at the stage of adding names and joined dates of members. The names are stored in an array and written to a file called members.txt. I would like to delete a member in the middle of the text file. After deletion i will load this new list of names back into the structure. Now the problem is

    When i delete a name in the MIDDLE. I dont want to leave empty spaces so i tried to use the "\r" to use the name below to overwrite the name i want to delete. It does not seem right to me. because when i print from the file the tab space does not work on the name directly below the deleted name. The relevant code is as follows :


    this is the delete function.
    Code:
    void delete_from_memfile(char members_name[50],struct members member[1000])
    {                                           // members_name = MEMBERS NAME ONLY.          
     char members_det[58];                      // this string reads a line from file (here DUMMY)
     int total_members,ctr,i=1;                 // ctr is the line number in file.
     char members_del[58];                      // holds name and joined_date together from struct
     
     total_members = load_members(member);                     // load the structure from file
     
     FILE *members;
     
     members = fopen("members.txt","w");                       // write to file the DELETED member
     
     if(members == NULL)
      {
       printf("\n\tWARNING : UNABLE to open members.txt\n");
       return;
      }
       
      for(ctr=0;ctr<total_members;ctr++)
       {
         members_del[0] = '\0';                          // clears the string
                                                                            
        if(!(strcmp(members_name,(member[ctr].name))))   // use ctr as line number to write
         {
                                                         // ctr as member to be deleted.
     /*\r*/ strcpy((member[ctr].name),"");
            strcpy((member[ctr].joined_date),"");             
            fprintf(members,"%s","\r");
            continue;
                                                         /* test printf("\n%s%s\n",(member[ctr].name),(member[ctr].joined_date));*/     
         }
                                                         /* test else printf("\n%s%s\n",(member[ctr].name),members_name); */
                                                
          strcat(members_del,(member[ctr].name));        // here do the string concatanate for ALL strings.
          strcat(members_del," ");
          strcat(members_del,(member[ctr].joined_date));
           
          fprintf(members,"%s",members_del);             // write line by line(ctr as line number) to file
       
                                                         /* test printf("%s\n",members_del); */
          members_del[0] = '\0';                         // clears the string
       }
                                                         /* test printf("%s\n",members_del); */
     fclose(members);   
     
    total_members = load_members(member);                // load the structure from file
    return;
    }
    
    
    
    the load function loads the updated text file to the structure.

    Show function is to print from the text file.

    Code:
    
    void show(void)
    {
     char members_det[58];                                      // a line from file              
     FILE *members;              
     
     members = fopen("members.txt","r");
     
     if(members == NULL)
      {
       printf("\n\tWARNING : UNABLE to open members.txt\n");
       return;
      }
      
        printf("\n\n\n\t\tNAME   JOINED-DATE\n");
        
      while(fgets(members_det,58,members))             // load a line into members_det string
       {   
        printf("\t\t%s",members_det);
     
       }
        printf("\n\n");
    
    fclose(members);
    return;
    }
    
    
    
    
    
    

    The entire code is shown below


    Code:
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    
    struct borrowed
    {
     char member_name[50];                 // to access from borrowed.txt file         
     char items_name[150];
     char type;
     char due_date[8];               
    };
    
    struct members
    {
     char name[50];
     char joined_date[8];
     struct borrowed borrowed_items[5];
    };
    
                                                                                                                            
    int security(char username[10],char password[10]);  // fucntion prototypes
    void store_in_memfile(char members_init[58]);       // stores name and joined date to file
    void delete_from_memfile(char members_name[50],struct members member[1000]);    // deletes the member
    int update_total_members(void);
    int load_members(struct members member[1000]);     // ONLY loads NAME and JOINED DATE to structure members, RETURNS total number of members 
    void show(void);
    
                    // START of MAIN
    int main()
    {
      char username[10],password[10];
      int op=1;
      
      char members_init[58],members_det[58];             // name and joined_date                                                                       
      char members_name[50];                             // name to DELETE
      int total_members;                                 // takes the value of line counter
      struct members member[1000];
      
      printf("\n\t\tCalvary Life Assembly Digital Library\n\n\n");
      
      while(1)                                      // security while loop
       {
        printf("Please enter your USERNAME and PASSWORD\n");
        strcpy(username,"x");                       // clear the u_n and p_w    
        strcpy(password,"x");
        scanf("%s%s",username,password); 
        if(security(username,password))
         {
         continue;
         }
        else
         {
          printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");  // hide the p_w
          printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
          printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
          printf("\nSECURITY CLEARED!\n\n"); 
          break;
         }
       }                                            // security while loop
     
     
      printf("\n\t\tCalvary Life Assembly Digital Library\n\n\n\n");
     
      while(1)
       {
        fflush(stdin);                    
        printf("\n\tPress    1   - ADD New MEMBER\n\n");
        printf("\tPress    2   - DELETE a MEMBER\n\n");
        printf("\tPress    3   - VIEW All members\n\n");
        printf("\tPress ctrl c - EXIT\n\n\n");
        printf("You Entered --> : ");
        scanf("%d",&op);    
        
         if(op == 1)
          {                                       // read from keyboard
             printf("\nEnter FULL NAME with _ for spaces AND(after a space) Today's date <dd/mm//yy>.\n");
             fflush(stdin);
             fgets(members_init,58,stdin);          
             fflush(stdin);
                                                                  
             store_in_memfile(members_init);      // append to members.txt file   
                                                          
          }
          
         if(op == 2) 
          {      
            printf("\n\tWARNING : You are about to DELETE a member.\n");
            printf("\nEnter the FULL NAME with _ for spaces between words.\n");
            fflush(stdin);
            scanf("%s",members_name);
           
            delete_from_memfile(members_name,member);    // delete a member, sending MEMBER NAME ONLY
            
          }
          
         if(op == 3) 
          {
           show();
          
          }
         if(op == 4) 
          {
          
          }
          
         total_members = update_total_members();       // update total_membters after store or delete members, 
                                                       //  printf("\n\ntotal members = %d",total_members);
         load_members(member);                         // load members NAME and JOINED DATE from file into structure
        /* test*/
           
         
       
       }
    
    
    system("pause > null");
    return 0;
    }                                                  // END OF MAIN           
    
    
    int security(char username[10],char password[10]) // 0 is correct and 1 is wrong
    {
      if(!(strcmp(username,"1")) && !(strcmp(password,"1")))
       return 0;
      else
       return 1; 
    }
    
    void store_in_memfile(char members_init[58])
    {
     FILE *members;
     
     members = fopen("members.txt","a");
     
     if(members == NULL)
      {
       printf("\n\tWARNING : UNABLE to open members.txt\n");
       return;
      }
      
     if(members_init[0] != '\n')            // capture the ENTER KEY and prevent it written to file.                                                            
      {
       fprintf(members,"%s",members_init);        // add the new member              
      }
      
     fclose(members);                          
    return;                             
    }
    
    int update_total_members(void)
    {
     FILE *members;
     int line_no=0;
     char members_det[58];
     
     members = fopen("members.txt","r");
     
     if(members == NULL)
      {
       printf("\n\tWARNING : UNABLE to open members.txt\n");
       return 0;
      }
    
     while(fgets(members_det,58,members))       // update total_members
      {
      line_no = line_no + 1;  
      }  
                                                                
     fclose(members); 
                              
    return line_no;                             // update total_members 
    }
    
    void delete_from_memfile(char members_name[50],struct members member[1000])
    {                                           // members_name = MEMBERS NAME ONLY.          
     char members_det[58];                      // this string reads a line from file (here DUMMY)
     int total_members,ctr,i=1;                 // ctr is the line number in file.
     char members_del[58];                      // holds name and joined_date together from struct
     
     total_members = load_members(member);                     // load the structure from file
     
     FILE *members;
     
     members = fopen("members.txt","w");                       // write to file the DELETED member
     
     if(members == NULL)
      {
       printf("\n\tWARNING : UNABLE to open members.txt\n");
       return;
      }
       
      for(ctr=0;ctr<total_members;ctr++)
       {
         members_del[0] = '\0';                          // clears the string
                                                                            
        if(!(strcmp(members_name,(member[ctr].name))))   // use ctr as line number to write
         {
                                                         // ctr as member to be deleted.
     /*\r*/ strcpy((member[ctr].name),"");
            strcpy((member[ctr].joined_date),"");             
            fprintf(members,"%s","\r");
            continue;
                                                         /* test printf("\n%s%s\n",(member[ctr].name),(member[ctr].joined_date));*/     
         }
                                                         /* test else printf("\n%s%s\n",(member[ctr].name),members_name); */
                                                
          strcat(members_del,(member[ctr].name));        // here do the string concatanate for ALL strings.
          strcat(members_del," ");
          strcat(members_del,(member[ctr].joined_date));
           
          fprintf(members,"%s",members_del);             // write line by line(ctr as line number) to file
       
                                                         /* test printf("%s\n",members_del); */
          members_del[0] = '\0';                         // clears the string
       }
                                                         /* test printf("%s\n",members_del); */
     fclose(members);   
     
    total_members = load_members(member);                // load the structure from file
    return;
    }
    
    
    int load_members(struct members member[1000])               // loads ONLY NAME and JOINED DATE to structure
    {
     FILE *members;
     char members_det[58];                                      // a line from file
     char *temp_name,*temp_joined_date;                         // strings to hold PARSE tokens
     int i=0;                                                   // struct counter
     
     members = fopen("members.txt","r");
     
     if(members == NULL)
      {
       printf("\n\tWARNING : UNABLE to open members.txt\n");
       return 0;
      }
      
     while(fgets(members_det,58,members))       // load a line into members_det string
      {
        temp_name = strtok(members_det," ");    // parse the string members_det into tokens, first token is from 1st char to " ".
        temp_joined_date = strtok(NULL,"");     // second token(string) is from char after " " to end of word/line.
         
         if(temp_joined_date == NULL)           // precaution against blank lines in file.
          continue;
        
        strcpy((member[i].name),temp_name);
        strcpy((member[i].joined_date),temp_joined_date);
        i++;
      }  
                                                // printf("\n%s  %s\n",(member[9].name),(member[9].joined_date));
                                                                     
     fclose(members); 
     
    return i;
    }
    
    void show(void)
    {
     char members_det[58];                                      // a line from file              
     FILE *members;              
     
     members = fopen("members.txt","r");
     
     if(members == NULL)
      {
       printf("\n\tWARNING : UNABLE to open members.txt\n");
       return;
      }
      
        printf("\n\n\n\t\tNAME   JOINED-DATE\n");
        
      while(fgets(members_det,58,members))             // load a line into members_det string
       {   
        printf("\t\t%s",members_det);
     
       }
        printf("\n\n");
    
    fclose(members);
    return;
    }
    
    
    
    
     
  2. sirama

    sirama New Member

    Different OS sees new line differently.
    /n: Line Feed
    /r: Carriage return

    Windows: Sees new line as the combination CRLF. Carriage return and line feed. /r/n
    Unix: Sees new line as single line feed. /n
    Mac os: It knows only /r

    Hope this helps.
     

Share This Page