gpt4 book ai didi

C电话本程序: Reposition cursor in text file to start of previous line

转载 作者:太空宇宙 更新时间:2023-11-04 03:56:50 24 4
gpt4 key购买 nike

编写一个 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 字符的文本文件有关。想知道是否有更好的方法来简单地覆盖与用户搜索匹配的行,或者至少将光标重置到与搜索匹配的行的开头。我在这个网站上做了很多谷歌搜索和搜索,但我无法找到任何我理解如何实现的东西。非常感谢您的帮助!干杯

最佳答案

I have fseek commented as it behaves strangely depending on if the contact being searched is at the end of the list.

fseek(fp, -(strlen(phoneInfo)+1), SEEK_CUR);

在最后一行,你应该返回 strlen(phoneInfo),而不是 strlen(phoneInfo)+1。

因为在其他行中,有一个换行符。但在最后一行,可能没有。您可以按照效率较低的方式修改它:

if(line[strlen(line)-1]=="\n"){
fseek(fp, -(strlen(phoneInfo)+1), SEEK_CUR);
}
else{
fseek(fp, -strlen(phoneInfo), SEEK_CUR);
}

顺便说一下,只有当 phoneInfo 的长度与 txt 文件中的长度相同时,您的代码才能正常工作。

关于C电话本程序: Reposition cursor in text file to start of previous line,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15725141/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com