【问题标题】:C FILE fgets function working in this codeC FILE fgets 函数在此代码中工作
【发布时间】:2019-08-24 18:26:02
【问题描述】:

在我的代码中,我有一个名为“f1.txt”的文件,该文件中的文本是一个字符串“robin singh hero”

我创建了一个大小为 [10] 的字符串 [b]str[/b] 和一个 FILE 类型指针变量 *fp,然后从 fopen 函数为这个指针分配了我的文件“f1.txt”的地址。

然后我使用了 fgets 函数,它接受这三个参数(字符串、大小、文件指针)

#include <stdio.h>

void main()
{
  char str[10];
  FILE *fp;

  fp = fopen("f1.txt","r");

  if(fp == NULL)
  {
  printf("File does not exists");
  exit(1);
  }

  while (fgets(str,8,fp)!=NULL){
    printf("%s",str);
  }
  printf("\n");
  fclose(fp);
  puts(str);
  puts(str);
}

我提到了大小 8,所以这意味着 fgets 将从我的文件中读取前八个字符(robin sin)并将其存储到大小为 10 的字符串中,并且在我的字符串中还剩下 2 个字节的空间。然后直到我的文件达到空值,它会复制接下来的 8 个字符(gh hero)。

所以我想知道这个: 1.现在还有6个字符,但实际结果是(robin singh hero)

  1. 当只剩下 6 个字符时,第二步发生了什么。

  2. 我想知道在这个 while 循环结束后我的字符串 str 发生了什么。所以我做了 puts(str) 并且我在终端中得到了这个值 (ro)。

下面是这段代码的实际结果: 罗宾辛格英雄

【问题讨论】:

  • 关于:printf("File does not exists"); 这不是(必然)正确的。建议:perror( "fopen failed" ),因为这会将您的错误消息和系统认为发生错误的文本原因输出到stderr

标签: c pointers file-handling fgets


【解决方案1】:

正如您在问题中所述,文件f1.txt 包含此

robin singh hero

现在当下面的代码被执行时

while (fgets(str,8,fp)!=NULL){
    printf("%s",str);
}

fgets()fp 指向的文件中读取大小减去一个字符即7 字符并存储在str 中。所以在第一次迭代中printf() 语句打印

robin s

然后在第二次迭代中,它再次尝试读取 7 字符,即 printf() 语句打印

ingh he

然后它再次尝试读取7 字符,但只有3 字符(包括\n,如果是的话)所以printf() 语句打印

ro

下面的代码段

printf("\n"); /* prints \n character on console */
fclose(fp); /* closes the file */
puts(str); /* when above while loop terminates str has ro in it, hence it prints ro on console */
puts(str); /* prints ro on console */

因为您已经调用了两次puts(),所以它会打印两次ro

来自fgets()的手册页

fgets() 最多读取一个小于 size 的字符 流并将它们存储到 s 指向的缓冲区中。阅读 在 EOF 或换行符之后停止如果读取了换行符,则将其存储 进入缓冲区。终止空字节 (aq\0aq) 存储在 缓冲区中的最后一个字符。

还要注意void main() {} 不是标准的main() 原型。你应该使用

int main(void) {

   return 0;
}

来自 C 标准 5.1.2.2.1 程序启动

1 程序启动时调用的函数名为main。这 实现没有声明这个函数的原型。它应 定义为 返回类型为 int 且不带参数

int main(void) { /*...*/ }

有两个参数(这里称为argcargv,尽管任何 可以使用名称,因为它们对于它们所在的函数是本地的 声明):

int main(int argc, char *argv[]) { /*...*/ }

【讨论】:

    猜你喜欢
    • 2018-04-27
    • 2011-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-09
    • 1970-01-01
    • 2019-11-11
    相关资源
    最近更新 更多