HOW to use "\r" properly?

jose_peeterson's Avatar, Join Date: May 2011
Contributor
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;
}
0
sirama's Avatar, Join Date: Jun 2012
Light Poster
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.