繁体   English   中英

C中的fgets函数和文件处理

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM