【问题标题】:Reading from txt file in c从c中的txt文件读取
【发布时间】:2020-10-09 18:02:13
【问题描述】:

所以我在阅读文本文件时遇到了麻烦。我对代码很陌生,我希望我的代码能够读取简单的 .txt 文件并存储一些内容:人名、时间(姓名后的 nr)等等。

我的 txt 文件格式如下: txt file 我需要存储一个人的姓名,该姓名位于 "." 之后和 ":" 符号之前:

  1. 佩德罗·门德斯:45

例如,在这一行中,我需要存储“Pedro Mendes”。

我的代码不能正常工作:

FILE *f;
f = fopen(filename,"rt");
if(f==NULL){
    printf("Erro no acesso ao ficheiro.\n");
    return NULL;
}

(...)

while(fgetc(f) != '.'); // finds the point
fscanf(f," %s %s",pnome,unome); //saves the name of a person
while(fgetc(f) != ':');
fscanf(f,"%d",&tempo);

我应该得到"Pedro Mendes",但我有"Pedro Mendes:",暂时我应该得到45,但我有46(我相信是从下一行读取)。

如果有人有很好的答案,谢谢。

【问题讨论】:

  • 也许(在找到 '.' 之后)if(fscanf(f, "%s %[^:]:%d", pnome, unome, &tempo) == 3) { /* success */ } 尽管 IMO 最好用 fgets 阅读每一行并进行分析。
  • 感谢您的回答。它有效!

标签: c file scanf fgets


【解决方案1】:

您可以像这样删除':'

char *c = strchr(unome, ':');
if(c)
    *c = '\0';

至于读错数字,删除while(fgetc(f) != ':');,因为':' 存储在unome 中。

【讨论】:

    【解决方案2】:

    scanf 家族函数被称为穷人的解析器。它旨在直接处理空格分隔的元素(此处的行尾是空格)。在任何其他情况下,它可以使用或不使用,但必须非常谨慎,并且其他库函数通常执行得更好(在更简单或更健壮的代码的意义上)。

    IIUC,你有:

    • 你忽略的东西,直到一个点 (.)
    • 一个点
    • 表示名称的字符串,最多为冒号 (:)
    • 冒号
    • 代表时间的数字

    如果您不关心正确的行分隔,您可以使用[] 格式说明符:

    FILE *f = fopen(filename,"rt");
    if (f == NULL) {
        ...
    }
    int cr = fscanf(f, "%*[^.].%[^:]:%d", nome, &tempo);
    if (cr != 2) {
        ...
    }
    

    你已经失去了分隔pnomeunome,但好消息是它会接受Juan Pedro Mendez y Garcia...

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-08-10
    相关资源
    最近更新 更多