【问题标题】:read from a formatted test file using fscanf() in c在 c 中使用 fscanf() 从格式化的测试文件中读取
【发布时间】:2017-11-15 09:57:47
【问题描述】:

这是文本文件

Username:user1  Password:pass1
Username:user2  Password:pass2

我想从文本中读取用户名和密码。问题是没有办法改变文本的格式。我试图阅读,但由于冒号(:) 之间没有空格,它将整个 username:user1 作为字符串提供,但我只想要 user1。我提到了this 的问题,但它没有帮助,因为冒号之间没有空格。

我试过了:

 while ((fscanf(fp,"Username:%s Password:%s",username,password))!=EOF)

但它在 user1 之后给出了许多未定义的字符,并且循环永远不会结束。

【问题讨论】:

  • fscanf()s返回值的含义请查阅相关文档。

标签: c file-io


【解决方案1】:

试试下面的代码:

#include <stdio.h>
#include <string.h>

int main (int argc, char *argv[])
{
    char username[128];
    char password[128];
    FILE *fp;
    int ret;

    fp = fopen("read.txt", "r");
    if (!fp) {
        printf("Failed to open a file\n");
        return 1;
    }

    while (1) {
        ret = fscanf(fp, "Username:%s Password:%s\n",username,password);
        if (ret == EOF)
            break;
        if (ret == 2)
            printf("%s %s\n", username, password);
        else {
            printf("%d\n", ret);
            perror("fscanf:");
            break;
        }
    }

    fclose(fp);
    return 0;
}

【讨论】:

  • fscanf(fp, "Username:%s Password:%s\n",username,password) -- 请注意,在scanf() 格式字符串中使用尾随空白字符是不好的做法。由于输入来自文件,这将按预期工作,但这是使用scanf() 进行交互式输入时的常见错误,它会导致问题。最好在格式字符串的开头放置一个空格以使用前面的换行符:fscanf(fp, " Username:%s Password:%s",username,password)
  • 此外,使用%s%[] 读取字符串时应指定最大宽度以避免缓冲区溢出:fscanf(fp, " Username:%127s Password:%127s",username,password)
  • 为什么你检查 ret 值为 2 ?在 if(ret == 2) 中?
  • @JayJoshi 你需要看看 fscanf 函数返回值: 成功时,这些函数返回成功匹配和分配的输入项数;如果发生早期匹配失败,这可能会小于规定的值,甚至为零。如果在第一次成功转换或匹配失败发生之前到达输入结尾,则返回值 EOF。如果发生读取错误,也会返回 EOF,在这种情况下,会设置流的错误指示符(参见 ferror(3)),并设置 errno 以指示错误。
  • @PrabhakarLad -- "如果发生读取错误,也会返回 EOF,在这种情况下会设置流的错误指示符(参见 ferror(3)),并设置 errno 以指示错误. " 请注意,这不在标准中,而是 POSIX 扩展。
【解决方案2】:

我会使用这个算法:

  1. 读取字符时读取不是 ':'

  2. 在读取的字符为 !=' '

  3. 时,开始在用户名 var 上存储所有下一个字符
  4. 删除用户名字符串的最后一个空格

  5. 重复步骤 1。

  6. 与第 2 步相同,但现在我们将读取的数据存储在密码值上,而读取的字符为 != ''\n'

  7. 重复!文件结束

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-05-06
    • 1970-01-01
    • 1970-01-01
    • 2011-03-22
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    相关资源
    最近更新 更多