fprint没有循环工作

时间:2018-01-01 21:46:03

标签: c file loops printf

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

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

./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\n", 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\n", 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充当缓冲区,它实际上是一个很容易溢出的小缓冲区。

答案 1 :(得分:0)

这会奏效。 fgets()返回它从指定文件指针读取的字符串。如果此字符串仅返回换行符(“\ n”),则表示在word_pairs <- austen_section_words %>% pairwise_count(word, section, sort = TRUE) word_pairs #> # A tibble: 796,008 x 3 #> item1 item2 n #> <chr> <chr> <dbl> #> 1 darcy elizabeth 144 #> 2 elizabeth darcy 144 #> 3 miss elizabeth 110 #> 4 elizabeth miss 110 #> 5 elizabeth jane 106 #> 6 jane elizabeth 106 #> 7 miss darcy 92.0 #> 8 darcy miss 92.0 #> 9 elizabeth bingley 91.0 #> 10 bingley elizabeth 91.0 #> # ... with 795,998 more rows word_pairs <- austen_section_words %>% pairwise_count(word, document, sort = TRUE) word_pairs #> # A tibble: 36,078,042 x 3 #> item1 item2 n #> <chr> <chr> <dbl> #> 1 universally truth 1.00 #> 2 acknowledged truth 1.00 #> 3 single truth 1.00 #> 4 possession truth 1.00 #> 5 fortune truth 1.00 #> 6 wife truth 1.00 #> 7 feelings truth 1.00 #> 8 views truth 1.00 #> 9 entering truth 1.00 #> 10 neighbourhood truth 1.00 #> # ... with 36,078,032 more rows 处未输入任何内容。

stdin

已编辑的代码。