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在循环中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
onRequestPermissionsResult 在片段中不起作用