phoneList.txt というテキスト ファイルを開いて連絡先 (名、姓、電話番号) を検索し、既存の連絡先の電話番号を更新する C プログラムを作成します。私の問題は、電話番号の更新プログラムにあります。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 文字が含まれているテキスト ファイルに関係があると思います。ユーザーの検索に一致する行を単純に上書きするか、少なくともカーソルを検索に一致する行の先頭にリセットするより良い方法があるかどうか疑問に思っています。私はこのサイトでたくさんのグーグル検索と検索を行いましたが、実装方法を理解しているものは何も見つけられませんでした. 本当にありがとうございました!乾杯