fprint在循环中不起作用

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了fprint在循环中不起作用相关的知识,希望对你有一定的参考价值。

我试图从命令行重复读取一个字符串并将其打印到文件。这是我的代码:

int main ()
{
    FILE* fp=fopen("test.txt","w");
    char* tofile[10];
    while(1){
        printf("cat: ");
        scanf("%s",tofile);
        fprintf(fp,"%s
",tofile);
    }
    return 0;
}

它在循环外工作得很好。但在里面,它只是不打印。

fprintf函数返回必须打印的正确字符数。

注意:我知道有一个similar question out there,但它尚未得到解答,我希望我的代码可以帮助解决这个问题,因为它更简单。

答案

首先,它似乎不是你想要的是在命令行上阅读。您在执行程序时正确编写的命令行,例如:

./main things that are on the command line

你想要做的是阅读标准输入。

您应该考虑使用fgets函数,因为它具有要读取的字符限制,因此您可以“安全地”将它们存储到缓冲区中,就像您的tofile一样。如果您想阅读标准输入,可以使用stdin流(这是为每个程序自动创建的文件*)

这条线路

fgets(tofile, 10, stdin);

你的循环成为:

while (fgets(tofile, 10, stdin) != NULL) {
  printf("cat: ");
  fprintf(fp, "%s
", tofile);
}

意思是:只要我们可以读取标准输入,打印“cat:”并将我们刚刚读取的内容存储在由流指针fp控制的文件中。

一些重要的东西

当您尝试打开流时,它可能会失败,您应该测试它:

char filename[] = "test.txt";
FILE *fp = fopen(filename, "w");

if (fp == NULL) {
  fprintf(stderr, "Failed to open the file of name : %s", filename);
  return EXIT_FAILURE;
}

在退出main之前,您还应该关闭文件并检查文件是否成功,例如:

  if (fclose(fp) != 0) {
    fprintf(stderr, "Failed to close the file of name : %s", filename);
    return EXIT_FAILURE;
  }

整件事变成了:

#include <stdio.h>
#include <stdlib.h>

int main (void) {
  char filename[] = "test.txt";

  FILE *fp = fopen(filename, "w");

  if (fp == NULL) {
    fprintf(stderr, "Failed to open the file of name : %s", filename);
    return EXIT_FAILURE;
  }

  char tofile[10];

  printf("cat: ");

  while (fgets(tofile, 10, stdin) != NULL) {
    printf("cat: ");
    fprintf(fp, "%s
", tofile);
  }

  if (fclose(fp) != 0) {
    fprintf(stderr, "Failed to close the file of name : %s", filename);
    return EXIT_FAILURE;
  }

  return EXIT_SUCCESS;
}

改进

我不知道这只是一个小程序还是它渴望成为一个更大的计划。在最后一种情况下,你应该考虑使用定义,而不是一个神奇的数字,如

#define BUFFER_MAX_SIZE 10

char tofile[BUFFER_MAX_SIZE];
while (fgets(tofile, BUFFER_MAX_SIZE, stdin) != NULL) { ... }

这有助于提高可读性,并且在修改这样的大小时使程序不易调试。因为使用定义,所有需要大小的代码部分仍然可以完全正常运行而无需修改它们。


还请记住,你的tofile充当缓冲区,它实际上是一个很容易溢出的小缓冲区。

另一答案

这会奏效。 fgets()返回它从指定文件指针读取的字符串。如果此字符串仅返回换行符(“ n”),则表示在stdin中未输入任何内容。

#include <stdio.h>
#include <string.h>

int main(void)
{
    FILE *fp = fopen("test.txt","w");
    // always check if fopen() == null

    if (!fp) {
        fprintf(stderr, "Could not write to file
");
        return 1;
    }
    char tofile[30];
    printf("cat: ");
    while (fgets(tofile, 30, stdin)) {
        if (strcmp(tofile, "
") == 0)
            break;
        fprintf(fp, "%s", tofile);
        printf("cat: ");
    }

    // always fclose()
    fclose(fp);
    return 0;
}

编辑过的代码。

以上是关于fprint在循环中不起作用的主要内容,如果未能解决你的问题,请参考以下文章

java代码在片段活动中不起作用

Javascript代码片段在drupal中不起作用

onRequestPermissionsResult 在片段中不起作用

Onclicklistener 在片段列表视图中不起作用

Visual Studio 自定义代码片段在方法定义的参数列表中不起作用

按钮在片段中不起作用