0

如何阅读 ”;” 从c中的文件中分离字符串?我正在使用以下方法:

char c;
c=fgetc(fp);
while(c!=EOF)
{
    int k=0;
    if(c=='\n')
    c=fgetc(fp);
    while(c!=';')
    {
        str1[k]=c;
        k++;
        c=fgetc(fp);
    }
    str1[k]='\0';
    c=fgetc(fp);
    k=0;
    while(c!=EOF && c!='\n')
    {
        str2[k]=c;
        k++;
        c=fgetc(fp);
    }
    str2[k]='\0';
    Seq(str1,str2);
    printf("\n");
    if(c==EOF)
    {
        break;
    }
    else
    c=fgetc(fp);
}

输入文件:

     Hello;world

     Male;Female

     where;who

我必须读取不同的字符串值,然后将它们传递给 Seq(hello,world).. 等函数

有更好的方法吗?

4

3 回答 3

5

更好的方法是从文件中读取行,然后使用strchrstrpbrkstrcspnstrtoksscanf或其他库函数来查找 ';'。

于 2013-04-19T08:49:44.240 回答
3
while (fscanf(fp, " %[^;];%s", str1, str2) == 2)
  Seq(str1, str2);

只要非常确定str1并且str2足够大!

格式说明:

  • (space) : 跳过任何空格,包括换行符。
  • %[^;]: 读取一个不能包含分号的字符串。这不会跳过前导空格,因此我们必须明确地这样做(感谢@MOHAMED)。
  • ;: 读取并丢弃分号。如果不存在,则匹配失败。
  • %s: 读取一个字符串直到空白,所以基本上直到行尾。

fscanf返回匹配字段的数量。我们正在寻找两个,所以如果结果是任何其他数字,则输入失败。如果您的文件格式feof(fd)正确,则应返回 true,否则匹配会提前失败。

要正确偏执,您还应该包括字段宽度str1str2确保您不会出现缓冲区溢出。因此,如果您分配了 100 个字节,您将使用%99[^;](留下一个字节作为零终止符)。

于 2013-04-19T08:53:14.403 回答
1

您可以使用 " %[^;] ; %[^\n]" 作为 fscanf() 的格式说明符来执行此操作。它将读取文件直到遇到分号,然后是格式说明符中的分号string 将“吃掉”文件中该单词之后的分号。

于 2013-04-19T08:53:47.250 回答