读取文件然后将字符串与该文件中的内容进行比较的最佳方法是什么?

时间:2015-11-30 01:21:07

标签: c

读取文件然后将字符串与该文件中的内容进行比较的最佳方法是什么?我一直试图解决这个问题已经好几天了,我只是对如何做到这一点感到难过。我非常感谢一些帮助。

1 个答案:

答案 0 :(得分:3)

您的问题概括地从文件中读取字符串,并与另一个字符串进行字符串比较。要从文件中读取,必须先打开文件进行读取。为了从文件中读取文本,您在C中的正常选择是fopen来打开流并将返回值指向FILE指针,该指针可以与流读取函数的集合一起使用在标准库中找到。 (例如fgetcfgetsfscanfgetline等。)

您的工作是打开文件,验证文件是否已打开,从文件中读取所需信息,然后关闭该文件。要实现此目的,您需要准备一个缓冲区(字符数组或已分配的内存块),其中有足够的空间来保存从文件中读取的信息( nul-terminated +1 char字符)。如果没有 nul-terminatedating 字符,则您有一个字符数组而不是有效的字符串)一个简短的例子可能是:

char buf[256] = {0};  /* char array to hold 255 chars + nul-terminating char */
FILE *fp = NULL;      /* FILE pointer to hold return of fopen */

fp = fopen (filename, "r"); /* open file for reading    */
if (fp == NULL) {           /* if not open throw error  */
    fprintf (stderr, "error: file open failed 'filename'.\n");
    exit (EXIT_FAILURE);
}

如果您正在阅读单个字符串而文件中没有包含空格,则只需将fscanf的第一个单词读入buf即可。 fscanf返回与给定格式说明符匹配的成功转换次数。将字段宽度选项与格式说明符一起使用,以确保您只读取缓冲区将保留(例如"%255s")为 nul节省空间最后终止 char。使用fscanf的回复来验证您的阅读:

if (fscanf (fp, "%255s", buf) != 1) {
    fprintf (stderr, "error: fscanf read failure from 'filename'.\n");
    exit (EXIT_FAILURE);    
}

如果您从文件中读取的字符串可以包含空格,那么您需要修改fscanf 格式说明符,(例如{{1其中字符类 "%255[...]"描述符合您所需信息的表达式)或使用面向行的流函数之一([...]fgets)将文件中的整行读入getline,然后根据需要在文件中解析buf。例如,如果文件中的第一行包含由逗号分隔的文本:

buf

并且您需要将逗号之前出现的信息与测试字符串进行比较,您可以执行以下操作:

The quick brown fox, jumps over the lazy dog.

最后,为了比较字符串是否相等,通常的选择是使用char str[256] = {0}; /* string to hold chars parsed from buf */ if (fgets (buf, 256, fp) == NULL) { fprintf (stderr, "error: fgets read failure from 'filename'.\n"); exit (EXIT_FAILURE); } if (sscanf (buf, "%[^,]", str) != 1) { fprintf (stderr, "error: sscanf no conversion made.\n"); exit (EXIT_FAILURE); } 。如果strcmp的比较结果为strcmp,则两个字符串相等。您可以执行以下测试:

0

哪个会用if (strcmp (str, teststr) == 0) /* test if strings are equal */ printf ("\n string : %s\n teststr : %s EQUAL\n", str, teststr); else printf ("\n string : %s\n teststr : %s DIFFER\n", str, teststr); 执行测试并打印从文件和teststr读取的字符串以及字符串是EQUAL还是DIFFER。

您可以将所有部分放在一起,如下所示。 (注意:程序将文件名作为第一个参数,但是使用简单的strcmp运算符,如果没有给出文件名,则使用默认文件名ternary - data.txt可以取代stdin默认情况下从"data.txt"读取内容:

stdin

输入文件

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

int main (int argc, char **argv) {

    char buf[256] = {0};  /* char array to hold 255 chars + null-terminating char */
    char str[256] = {0};  /* string to hold chars parsed from buf */
    char *teststr = "The quick brown fox";  /* string literal for comparison */
    FILE *fp = NULL;      /* FILE pointer to hold return of fopen */

    fp = fopen (argc > 1 ? argv[1] : "data.txt", "r");  /* open file for reading    */
    if (fp == NULL) {                                   /* if not open throw error  */
        fprintf (stderr, "error: file open failed 'filename'.\n");
        exit (EXIT_FAILURE);
    }

    if (fgets (buf, 256, fp) == NULL) { /* read 1 line from file */
        fprintf (stderr, "error: fgets read failure from 'filename'.\n");
        exit (EXIT_FAILURE);    
    }
    fclose (fp);            /* close file when reading complete */

    if (sscanf (buf, "%[^,]", str) != 1) {  /* parse up to ',' into str */
        fprintf (stderr, "error: sscanf no conversion made.\n");
        exit (EXIT_FAILURE);    
    }

    if (strcmp (str, teststr) == 0) /* test if strings are equal */
        printf ("\n string  : %s\n teststr : %s  EQUAL\n", str, teststr);
    else
        printf ("\n string  : %s\n teststr : %s  DIFFER\n", str, teststr);

    return 0;
}

使用/输出

$ cat dat/qbfcomma.txt
The quick brown fox, jumps over the lazy dog.

如果您有任何其他问题,请与我们联系。

注意:您只需将$ ./bin/fgets_strcmp dat/qbfcomma.txt string : The quick brown fox teststr : The quick brown fox EQUAL 格式说明符 fscanf一起使用即可将相同的信息读入"%255[^,]",然后只需针对buf测试buf,而无需使用teststr将该行解析为str。但重要的是要注意,通常的方法是使用面向行的(一次读取一行),然后从代码中的行解析所需的信息。这将避免因使用sscanf或尝试将所有模式匹配变为fscanf格式说明符而产生的一些陷阱。它还允许从缓冲区解析所需信息的其他方法(例如使用指针算法等)。