[英]fgets function and file handling in C
我正在尝试制作一个程序,该程序将用户输入的数据存储在名称由用户提供的文本文件中。 当用户进入出口时程序将终止。 string.h的strcmp函数用于字符串比较,而fgets()用于从stdin读取数据。
这是我的代码。
#include<stdio.h>
#include<string.h>
void main()
{
char file[60]; // will store file name
printf("Enter file name: ");
fgets(file, 59, stdin);
FILE *fp = fopen(file, "a+"); // open file in append mode
if(fp == NULL){
printf("File not found !");
return;
}
char data[100];
printf("Enter some data to add to file(exit to terminate): ");
fgets(data, 99, stdin);
int flag = strcmp(data, "exit");
while(flag != 0){
fputs(data, fp);
fgets(data, 59, stdin);
flag = strcmp(data, "exit");
printf("%d\n", flag); // for checking whether string are correctly comapred or not
}
printf("Bye");
}
即使我进入出口,程序也不会终止。 我也尝试在用户输入的字符串末尾连接“ \\ n”,但这也无济于事。 虽然gets()函数可以正常工作,但我知道使用fgets()并不是首选,但是它对我不起作用。
检查手册页中的fgets()
,它在输入后读取并存储换行符(按ENTER引起)。 因此, strcmp()
失败。
在比较输入之前,必须手动从换行符中除去输入缓冲区。 一个简单而优雅的方法是
data[strcspn(data, "\n")] = 0;
fgets
读取完整的“行”,即一系列字符,直到(包括!)换行符为止。 因此,当用户按下“ Enter”键时,新行将成为读入字符串的一部分,并且strcmp(data,"exit")
评估结果为“不等于”。
因此,要么在比较之前删除新行,要么与包含新行的字符串文字进行比较。 由于您将数据原样(即包括新行)写入文件,因此先剥离新行并手动添加然后将其添加到输出中似乎很麻烦。 所以我实际上建议第二种方法:
fgets(data, 100, stdin);
flag = strcmp(data, "exit\n");
如果多余的字符无关紧要,则可以使用strstr
(即,如果用户键入“ exit”或“ asdfexitasdf”,则程序将退出-两者都包含“ exit”。)
所以
int flag = strstr(data, "exit");
if(flag != NULL)
//exit the program
else
//stay in the program
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.