- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
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/
我正在运行 Windows 7 - 64 位,最新的 XAMPP 版本具有 32 位 PHP 版本。 关于测试http://php.net/manual/en/function.fseek.php#1
我在代码中遇到一种情况,其中有一个巨大的功能,可以逐行解析记录,验证并写入另一个文件。 如果文件中有错误,它将调用另一个函数来拒绝记录并写入拒绝原因。 由于程序中的内存泄漏,它会随着SIGSEGV崩溃
这不是一个纯粹的编程问题,但是它会影响使用fseek()的程序的性能,因此了解其工作原理非常重要。一点免责声明,以便它不会被关闭。 我想知道在文件中间插入数据的效率如何。假设我有一个具有1MB数据的文
在最后一个 while 循环中,应打印文件中存储的每 5 个字符,但循环无限期地进行并且不会终止。feof() 函数应该在到达 END OF FILE 时返回 1,并且应该退出循环,但循环会无限期地进
代码的作用:我读取一个二进制文件并对其进行排序。我使用频率阵列来做到这一点。更新:它确实执行了循环,但它没有正确地写入数字...... 这就是代码。我想在读取文件后写入文件。我会在已经写好的内容上加上
我想像这样计算文件字符: #include #include int main(){ int d=0; char filename[25]; FILE *file;
我想从 file.txt 中读入缓冲区几行。 目前,我fseek 和fread 循环中的每一行。我知道这些线是什么,因为我保留了它们的索引列表。因此,如果我想读取第 5 行到第 10 行,我就确切地知
我正在文件内容中搜索字符串,并通过排除空格“”将整个内容存储在 buff char[] 中,最后将此 buff char[] 与用户输入字符串进行比较以检查可用性。 但是我无法存储整个文件内容,因为
我写了这段代码,函数 fseek() 似乎有问题。因为它会影响文本文件的读取。它使函数 fscanf() 从文件中读取诸如垃圾和错误数据之类的内容。我的文件只包含 float 。 FILE *fptr
这个问题已经有答案了: fseek on a position beyond EOF does not trigger EOF using feof, how come? (4 个回答) 已关闭 8
底部解决方案 我正在开发一个 IP 转发程序。读取一个 header 字段后,我使用 fseek() 将文件指针指向下一个 IP header 字段的开头。只是,我的当前位置值为 20,偏移量为 40
我使用 fseek 和 fread 函数读取文件的指定 block ,然后将其写入另一个文件。由于某种原因,在目标文件中,我在其中写入的每个 block 之间有大约 20 个字节的重叠。 有人可以帮我
使用以下代码,我尝试从文件中读取 4 个字节: FILE *f uint32_t read_program(int A) { long i; uint32_t strofprog;
我有一个具有以下结构的 .dat 文件: Object name | Area | Length |Form Factor 我正在尝试查找哪个对象具有最小面积。我读取了整个文件并使用 ftell()
我正在制作一个 C++ 安装程序,我已将要提取的文件和要在程序中提取的文件的 8 字节文件大小附加到可执行文件中。我的程序因文件读取错误而退出,出了什么问题?请注意,除了我今天学到的知识外,我对 c
我在使用 fseek 时遇到了问题。我有一个包含获取的 HTTP 数据的文件指针。然后我让 libmagic 确定文件的 mime 类型,然后想倒带: char *mime_type (int fd)
这个问题在测验中弹出: 用正确的数字替换“Z”以将 FILE 指针“fp”设置为文件的最后一个字节: fseek( fp, Z, SEEK_END ); 我的回答是 -1,因为对我来说,位于某个字节意
我知道这个问题听起来很傻,但我不知道什么时候修改我的文件指针。我刚开始学习文件在 C 中是如何工作的。我正在做一个简单的练习,我必须编写一个函数来显示文件的大小并将文件指针作为参数。这是我的功能: i
我对 C 中的 fseek() 用法有疑问。我知道它可以设置由 fopen() 创建的文件描述符的偏移位置。但是它是否也可以设置新建文件的偏移位置呢?更具体地说,我可以: FILE * pFile
我正在编写一个比较文件大小的方法(就像任何比较方法一样)。这是我的方法(我使用 void * 作为参数,因为程序的其他部分需要它): int compareFileSize(void * p1, vo
我是一名优秀的程序员,十分优秀!