gpt4 book ai didi

c - 更多地了解 fseek() 和 EOF IN C

转载 作者:行者123 更新时间:2023-11-30 19:23:59 26 4
gpt4 key购买 nike

fseek 和 fseek 中的值 0L 这个值意味着什么,seek_end 意味着从末尾开始也可以帮助我处理 EOF ctrl+z 不起作用

void modify()
{
int ch1;
FILE *f1;
char c,*word,*sent,fname[20];
printf("Enter the filename to be modified: ");
scanf("%s",fname);
if(searchpath(fname))
{
printf("\n1.Character");
printf("\n2.Word");
printf("\n3.Sentence");
printf("\nEnter U'r choice: ");
scanf("%d",&ch1);
if(ch1==1)
{
f1=fopen(fname,"a+");//use to search the fiel in path variables
fseek(f1, 0L, SEEK_END);
printf("Enter the character and CTRL+Z to exit:\n ");
while((c=getchar())!=EOF)
{
putc(c,f1);
}
}
else if(ch1==2)
{
printf("Enter the word: ");
scanf("%s",word);
f1=fopen(fname,"a+");
fseek(f1, 0L, SEEK_END);
fputs(word,f1);
}
else
{
printf("Enter the sentence and CTRL+Z to exit: ");
f1=fopen(fname,"a+");
fseek(f1, 0L, SEEK_END);
while((c=getchar())!=EOF)
{
putc(c,f1);
}
}
}
else
printf("\nFilename does not exist");
fclose(f1);
}

当我运行代码并调用 printf("输入字符并按CTRL+Z退出:\n "); while((c=getchar())!=EOF) { putc(c,f1); }当我点击 ctrl+z 我得到 -> 箭头标记并输入 i 达到无限循环还使用 fflush(标准输入);它丢失了文件的地址并抓取了一些垃圾地址,

最佳答案

您有几个问题,我会将大问题留到最后。

首先,无限循环可能是由您使用 getchar 的方式造成的。

getchar 返回从 stdin 读取的字符值。如果出现错误或文件结尾,它会返回 EOF(与平台相关的值,但通常为 -1)。然而,只有当您在调用程序时将文件重定向到标准输入时,文件结束(可能取决于您的平台)才会真正发生 - 即,如果存在可以结束的文件。

在某些平台上,CTRL-Z 可能会被解释为文件结束符,CTRL-D 也可能如此,但这肯定不是通用的,我对它们中的任何一个都不确定。

如果 CTRL-Z 不被解释为文件结尾,则可能有两种可能的结果。一种是强行中断程序,有点像 Windows 命令提示符中的 CTRL-Break。另一个原因是 CTRL-Z 被视为与其他按键相同的按键,可能导致从 getchar 返回字符代码 26。

接下来,我认为您根本不需要 fseek,因为您的打开模式是“a+”,尽管它对我来说也没有问题 - 但我不再使用 C 来确定更多。

最后 - 我还认为您在如何使用 scanf 方面存在严重问题,这会导致严重的未定义行为。采用以下行...

scanf("%s",word);

您的变量word定义如下...

char c,*word,*sent,fname[20];

好吧,它是一个指向字符的指针 - 但该指针尚未初始化。您需要一个内存缓冲区来保存输入文本,并且需要初始化指针。通常,将 word 声明为字符数组会更容易,例如...

char word [100];

这确保有一些内存可用于保存结果字符串,但不能保证内存缓冲区足够大。对于现实世界的编程来说,这一点是一个严重的问题,但目前您可能不应该担心。

奇怪的是,您似乎已经解决了 fname 的这个问题。这表明您可能会在不了解问题的情况下自动应用人们的建议来修复代码,这有点令人担忧。因此,我会给您一个警告 - 您目前似乎没有使用 sent ,但如果它的使用方式与 word 相同,并且fname,它会遇到与 word 相同的问题。

关于c - 更多地了解 fseek() 和 EOF IN C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8378256/

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