0

我有一个文件,其中每一行如下所示:

cc ssssssss,n

其中前两个'c'是单个字符,可能是空格,然后是空格,然后是's'是一个8或9个字符长的字符串,然后是一个逗号,然后是一个整数。

我对c真的很陌生,我试图弄清楚如何将它放入每行4个单独的变量中(前两个字符中的每一个,字符串和数字)

有什么建议么?我看过 fscanf 和 strtok 但我不确定如何让它们为此工作。

谢谢你。

4

3 回答 3

5

正如问题所暗示的那样,我假设这是一个 C 问题,而不是标签可能暗示的 C++。

  1. 读入整行。

  2. 用于strchr查找逗号。

  3. 对前两个字符做任何你想做的事情。

  4. 将逗号换成零,标记字符串的结尾。

  5. strcpy从第四个字符开始调用以提取sssssss部分。

  6. 调用atoi逗号过去的一个字符来提取整数。

于 2013-03-01T07:33:54.050 回答
0

字符串是一个以第一个结尾的字符序列'\0'。请记住这一点。您描述的文件中的内容不是字符串。

我认为n是一个整数,可以跨越多个小数位并且可能是负数。如果是这种情况,我相信您需要的格式字符串是"%2[^ ] %9[^,\n],%d". 您需要传递fscanf以下表达式:

  1. 你的FILE *
  2. 格式字符串,
  3. 一个由 3 个字符组成的数组,默默地转换为一个指针,
  4. 一个由 9 个字符组成的数组,默默地转换为一个指针,
  5. ...和一个指向int.

将 fscanf 的返回值存储到 int 中。如果 fscanf 返回负数,则您遇到了诸如 EOF 或其他一些读取错误之类的问题。否则, fscanf 会告诉您它为多少对象赋值。在这种情况下,您正在寻找的“成功”值是 3。任何其他都意味着输入格式不正确。

我建议阅读fscanf 手册以获取更多信息和/或澄清。

于 2013-03-01T08:03:04.323 回答
0

fscanf功能非常强大,可用于解决您的任务:

  1. 我们需要读取两个字符——格式是“%c%c”。
  2. 然后跳过一个空格(只需将其添加到格式字符串中)-“%c%c”。
  3. 然后读取一个字符串,直到我们碰到一个逗号。不要忘记指定最大字符串大小。因此,格式为“%c%c %10[^,]”。10 - 要读取的最大字符数。[^,] - 允许的字符列表。^, - 表示除逗号之外的所有内容。
  4. 然后跳过一个逗号 - “%c%c %10[^,]”。
  5. 最后读取一个整数 - “%c%c %10[^,],%d”。
  6. 最后一步是确保读取所有 4 个令牌 - 检查 fscanf 返回值。

这是完整的解决方案:

FILE *f = fopen("input_file", "r");

do
{
    char c1 = 0;
    char c2 = 0;
    char str[11] = {};
    int d = 0;

    if (4 == fscanf(f, "%c%c %10[^,],%d", &c1, &c2, str, &d))
    {
        // successfully got 4 values from the file
    }
}
while(!feof(f));

fclose(f);
于 2013-03-01T08:14:59.970 回答