c - 如何替换文件中特定人物的字符串

标签 c string file

我遇到了一些问题。我已将字符串“缺席”设置为文件中的所有学生。但是,当输入分配给学生的正确 ID 时,我想将“缺席”替换为“出席”。换句话说,每次只有特定人员的“缺席”才会更改为“出席”。我不知道如何实现这一点,我恳请有人帮忙。提前致谢。

更新::====

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <time.h>
#include <errno.h>


typedef struct record {
  char *fname;
  char *lname;
  int code;
  char *stat;
} information;


int main (void) {
    int i;
  char ffname[28], flname[28], ans, status[15];

  int fID, j, id_, x;
  FILE *kfile, *ufile;
  x = 0;
  j = 0;
  i = 0;



  char buf[150];
  time_t curtime;
  struct tm* loc_time;
  information array[100];

  printf("          **********Attendance Recording System**********\n");
  printf("                                 MENU                     \n");
//Getting current time of system
  curtime = time (NULL);
// Converting current time to local time
  loc_time = localtime (&curtime);
  strftime (buf,150, "%I:%M %p.\n", loc_time);


//prints error message if file cannot be found within the system

    if ((kfile = fopen("information.txt", "r")) == NULL)    //If the file path is incorrect, an error message is displayed
    {
        fprintf(stderr, "Error while opening file  (%d: %s)\n",errno, strerror(errno)); //Error message that will be displayed if file path is incorrect

        return;
    }

    //while the file is opened and not at the end, the strings are stored into variables which forms an array of strings
     for (x = 0; x < 200; x++) {
      if (fscanf(kfile, "%s %s %d", ffname, flname, &fID) != 3)  //Reads the contents of the file
      break;
      array[x].fname = strdup(ffname);
      array[x].lname = strdup(flname);
      array[x].code = fID;
    }
   fclose(kfile);

   ufile= fopen("update.txt","w");
        strcpy(status, "Absent");
     fprintf(ufile,"First Name     Last Name     ID     Status     Time Arrived\n");
     for (i = 0; i < x; i++) {
     fprintf(ufile,"%-15s%-14s%2d%12s ",(array[i].fname), (array[i].lname), (array[i].code), status);
     fprintf(ufile,"%16s",(buf)); 

}
fclose(ufile);

while(j < x){
printf("Enter you ID: ");
scanf("%d", &id_);

strcpy(status, "Absent");
bool isPresentInFile = false;
for(i=0; i<x; i++)
{
    if(array[x].code == id_)
    {
        printf(" %s %s?", array[x].fname, array[x].lname);
        isPresentInFile  = true;
        break;
    }
}

if(isPresentInFile)
{
    strcpy(status, "present");
}

j++;
}

 fprintf(ufile,"First Name     Last Name     ID     Status     Time Arrived\n");
     for (i = 0; i < x; i++) {
     fprintf(ufile,"%-15s%-14s%2d%12s ",(array[i].fname), (array[i].lname), (array[i].code), status);
     fprintf(ufile,"%16s",(buf)); 

}
     fclose(ufile);


getch();
return 0;
}

更新 #3

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#include <time.h>
#include <errno.h>


typedef struct record {
  char *fname;
  char *lname;
  int code;

} information;


int main (void) {
    int i;
  char ffname[28], flname[28], ans, ans1, status[15];

  int fID, j, id_, x;
  FILE *kfile, *ufile;
  x = 0;
  j = 0;
  i = 0;



  char buf[150];
  time_t curtime;
  struct tm* loc_time;
  information array[100];

  printf("          **********Attendance Recording System**********\n");
  printf("                                 MENU                     \n");
//Getting current time of system
  curtime = time (NULL);
// Converting current time to local time
  loc_time = localtime (&curtime);
  strftime (buf,150, "%I:%M %p.\n", loc_time);


//prints error message if file cannot be found within the system

    if ((kfile = fopen("information.txt", "r")) == NULL)    //If the file path is incorrect, an error message is displayed
    {
        fprintf(stderr, "Error while opening file  (%d: %s)\n",errno, strerror(errno)); //Error message that will be displayed if file path is incorrect

        return;
    }

    //while the file is opened and not at the end, the strings are stored into variables which forms an array of strings
     for (x = 0; x < 200; x++) {
      if (fscanf(kfile, "%s %s %d", ffname, flname, &fID) != 3)  //Reads the contents of the file
      break;
      array[x].fname = strdup(ffname);
      array[x].lname = strdup(flname);
      array[x].code = fID;
    }
   fclose(kfile);



while(j < x){
    Next:
printf("Enter you ID: ");
scanf("%d", &id_);

strcpy(status, "Absent");
bool isPresentInFile = false;
for(i=0; i<x; i++)
{
    if(array[i].code == id_)
    {

        printf("Are you %s %s?", array[i].fname, array[i].lname);
        printf("\n");
        printf("[y/n only]: ");
        scanf(" %c", &ans);


        isPresentInFile  = true;
        break;
    }//end of if statement
}//end of for loop

if(isPresentInFile)
{
    strcpy(status, "present");
}//end of if statement
switch (ans){
    case 'y':
        ufile= fopen("update.txt","w");

     fprintf(ufile,"First Name     Last Name     ID     Status     Time Arrived\n");
     for (i = 0; i < x; i++) {
     fprintf(ufile,"%-15s%-14s%2d%12s ",(array[i].fname), (array[i].lname), (array[i].code), status);
     fprintf(ufile,"%16s",(buf)); 


}//end of for loop
fclose(ufile);
printf("Continue?\n");
printf("[y/n]: ");
scanf(" %c", &ans1);

if(ans1 == 'y'){
    break;
}//end of if statements
    else if (ans1 == 'n'){
        exit(EXIT_SUCCESS);
    }//end of else statement to check if ans1 is equal to 'n'

    case 'n':
        goto Next;
        break;
    default:
        printf("invalid entry. Try again");
}//end of switch case statememt
j++;
}//end of while





getch();
return 0;
}

最佳答案

从你的问题中,我不知道你到底想什么时候将状态“缺席”更改为“出席”

但是您可以使用相同的 strcpy() 方法来覆盖您的 status 变量。

...
strcpy(status, "Absent");
if(//condition)
{
    strcpy(status, "present");
}

更新1:

阅读您的评论后,我了解到您将提示用户输入 ID。如果它与文件中存在的 ID 匹配,则需要将 status 更新为 "present",然后写入新文件。

我可以想到这样的事情:

...
// read from file
.....
int ID;
printf("Enter you ID: ");
scanf("%d", &ID);

strcpy(status, "Absent");
bool isPresentInFile = false;
for(int i=0; i<x; ++i)
{
    if(array[x].code == ID)
    {
        isPresentInFile  = true;
        break;
    }
}

if(isPresentInFile)
{
    strcpy(status, "present");
}

...
// write to file
.....

更新2: 阅读更新的问题后,我注意到您正在最后写入文件!但每次都会覆盖状态变量。这样,您最终会为文件中的所有条目写入 "Absent""Present"(请注意,它与最后输入 ID 的候选人有关!)

要避免这种情况,请执行以下任一操作:

  1. 一旦了解候选人的状态,请立即写入文件。

    while(j < x)
    {
    printf("Enter you ID: ");
    scanf("%d", &id_);
    
    strcpy(status, "Absent");
    bool isPresentInFile = false;
    for(i=0; i<x; i++)
    {
        if(array[x].code == id_)
        {
            printf(" %s %s?", array[x].fname, array[x].lname);
            isPresentInFile  = true;
            break;
        }
    }
    
    if(isPresentInFile)
    {
        strcpy(status, "present");
    }
    
    // write to file here
    
    j++;
    }
    
  2. 在结构information 中还有一个名为status 的字段。 默认情况下,为所有候选人保留“缺席”。 然后将其设置为仅对输入 ID 的人员“呈现”。最后将其写入文件即可。

关于c - 如何替换文件中特定人物的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28892267/

相关文章:

c - 为什么我的密码检查代码不能正常工作?无论输入如何,它都提供相同的输出

c - 我的 c 函数做错了什么

php - 检查字符串是否为逗号分隔的数字列表

C++ 读取文件直到找到字符

python - 合并多个文件中的第一列

c - 如何将标准输入扫描到可变数量的流中

java - 正则表达式在空格和其他字符上分割字符串

arrays - 如何从c中的字符串数组中删除重复的字符串

python - 如何将 django 的 TemporaryUploadedFile 视为常规 python 文件

c - 如何在其他函数中使用二维数组?不知道如何让它发挥作用