在 C 语言中从文本文件中读取字符串并确定行尾

3

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

我正在尝试编写代码部分来识别一行末尾的“False”,但是遇到了困难。我需要让代码识别到已经到达了“False”并且打破for循环。

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

    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”,但结果相同。

1个回答

4

在C语言中,你不能用那种方式比较字符串。你需要使用strcmp()strncmp()来进行比较:

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

那个循环条件第一次指向“False”,就会退出循环。您还需要使 i 更大-在示例的第一次读取中,您将溢出该缓冲区。
编辑-您可能确实希望使用fgets()和strtok()或其相关函数来处理这些内容,这样会更容易。

就缓冲区而言,我认为缓冲区正在自动扩展。出于这个原因,我故意把它做得太小了。我看到过一些函数,它们会根据需要自动扩展。因为它成功地复制了,即使没有分配正确的长度,我认为它是在正确地复制。我想这不是事实,但这并不能解释为什么字符串仍然被正确地复制。我最初是用MATLAB学习的,所以我对内存分配的知识很差。我刚刚看到了atof函数。那应该让我使用gets。谢谢! - Shay
据我所知,在C语言中从不自动扩展缓冲区。可能有一些疯狂的库可以实现,但即使这样也不能改变数组的大小。 - Carl Norum

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接