【问题标题】:Reading strings from a text file in C and determining end of line从 C 中的文本文件中读取字符串并确定行尾
【发布时间】:2012-02-10 02:47:24
【问题描述】:

我正在尝试从空格和制表符分隔的文本文件中读取单词和数字。我需要识别包含“Step”和“False”的行。我还需要单独存储每个单词或数字,以便以后可以丢弃一些。

我在尝试编写在行尾标识“False”的代码部分时遇到问题。我需要代码来识别它已达到 False 并打破 for 循环。

注意:它的设计目的是让您输入自己的路径。这部分有效。另外,我读到 fscanf 比 fgets 和 fputs 更难使用,但是我正在读取的数据文件的格式非常一致。这似乎对我的目的很有效,因为有些条目需要双打。

    int j;
    int k;
    char i[4];                       
    char File_path[40];
    char dummy;
    char stuff[7] = "False"

    printf("Input Path: ");
    scanf("%s", &File_path);
    printf("Reading:  %s\n\n",File_path);
    FILE *fp;
    fp=fopen(File_path, "r");
    for(j=0; j<7 && i != stuff; j++)
    {
        fscanf(fp,"%s",i);
        fprintf(stdout,"Read:  %s\n",i);
    }
    fclose(fp);

我正在阅读的文件是:

True.0 kinda false False False

这会返回:

Reading:  c:\\Data\\1.txt

Read:  True.0
Read:  kinda
Read:  false
Read:  False
Read:  False
Read:  False
Read:  False

我尝试将内容更改为“False”,但结果相同。

【问题讨论】:

    标签: c string scanf printf


    【解决方案1】:

    您不能在 C 中以这种方式比较字符串。您需要使用 strcmp()strncmp() 来做到这一点:

    for (j = 0; j < 7 && strcmp(i, stuff); j++)
    

    条件循环将在i 第一次指向"False" 时中断。您还需要使 i 更大 - 在您的示例中,您将在第一次读取时溢出该缓冲区。

    社论 - 你真的很可能想使用 fgets()strtok() 或它的一个亲戚来解决这些问题。

    【讨论】:

    • 就缓冲区而言,我假设缓冲区正在自动扩展。出于这个原因,我故意把它弄得太小了。我见过一些功能,它们会根据需要自动扩展。因为即使没有分配正确的长度,它也能复制,我认为它复制正确。我想情况并非如此,但它不能解释为什么字符串仍然正确复制。我最初是用MATLAB学习的,所以我对内存分配的了解很差。我刚刚看到了atof的功能。那应该允许我使用gets。谢谢!
    • 据我所知,缓冲区的自动扩展从不发生在 C 中。也许有一些疯狂的库可以正常工作,但即使是那些也不能改变数组的大小。
    猜你喜欢
    • 2016-01-15
    • 2016-07-03
    • 2016-02-02
    • 2020-07-18
    • 1970-01-01
    • 2014-06-03
    • 2020-08-19
    • 2014-01-21
    • 1970-01-01
    相关资源
    最近更新 更多