编写一个 C 程序,该程序打开一个名为 phoneList.txt 的文本文件并搜索联系人(名字、姓氏、电话号码),并更新现有联系人的电话号码。我的问题出在更新电话号码程序中。当我使用 fgets 查找匹配名称来更新联系人时,光标位于下一行的开头,也就是在与用户搜索匹配的联系人之后的联系人开头。这是我的代码:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
int main(void){
struct record{
char firstName[20];
char lastName[20];
char phoneNum[15];
};
struct record info;
FILE *fp;
char line[100];
char phoneInfo[100];
char fullName[100];
char *stream;
int n = atoi(getenv("CONTENT_LENGTH"));
fgets(stream, n+1, stdin); //put query string into stream from stdin
//SET HTML OUTPUT AND TITLE, TEST CONTENT OF STREAM
printf("%s%c%c\n", "Content-type:text/html;charset=iso-8859-1",13,10);
printf("<p>%s</p>", stream);
sscanf(stream, "firstName=%[^&]&lastName=%[^&]&phoneNum=%s", info.firstName, info.lastName, info.phoneNum);
strcpy(fullName, info.firstName);
strcat(fullName, " ");
strcat(fullName, info.lastName);
strcpy(phoneInfo, fullName);
strcat(phoneInfo, " ");
strcat(phoneInfo, info.phoneNum);
//strcat(phoneInfo, "\n");
printf("%s", phoneInfo);
printf("\n");
//TEST FORMATTING OF PHONE INFO VAR
fp = fopen("phoneList.txt", "r+");
if(fp == NULL){
printf("Error opening the file.\n");
return 1;
}
while(fgets(line, 99, fp)!=NULL){
if(strstr(line, fullName)!= NULL){
//fseek(fp, -(strlen(phoneInfo)+1), SEEK_CUR);
fputs(phoneInfo, fp);
printf("Success! Number updated. \n");
fclose(fp);
return;
}
}
if(feof(fp)){
//fputs(phoneInfo, fp);
printf("goes to here");
}
fclose(fp);
return 0;
}
我有 fseek 评论,因为它的行为很奇怪,具体取决于正在搜索的联系人是否在列表的末尾。我认为这与其中包含 \n 字符的文本文件有关。想知道是否有更好的方法来简单地覆盖与用户搜索匹配的行,或者至少将光标重置到与搜索匹配的行的开头。我在这个网站上做了一堆谷歌搜索和搜索,但我找不到任何我理解如何实现的东西。非常感谢您的帮助!干杯