从文件中读取分号分隔的字符串

时间:2013-04-19 08:46:32

标签: c string file

如何阅读“;”从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)传递给函数..依此类推

有更好的方法吗?

3 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:3)

while (fscanf(fp, " %[^;];%s", str1, str2) == 2)
  Seq(str1, str2);

请确保str1str2足够大!

格式说明:

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

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

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

答案 2 :(得分:1)

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