【问题标题】:reading files details into a string, and int将文件详细信息读入字符串和 int
【发布时间】:2017-06-12 14:30:33
【问题描述】:

我有一个文件,包括(ID-9 位、名称-10 位、数量-4 位),例如:

123456789 Dany Bany 1000
999999999 Bill 9

我想阅读以下详细信息: ID 转字符串,名称转字符串,数字转 int。

我该怎么做?我应该考虑有包含 2 个单词的名称,其中一些包含 1 个单词。 我尝试使用它,但 2 个单词的名称有问题:

while (fscanf(file, "%s %s %d", id, name, &quantity) > 0) {
    printf("%s %s %d\n", id, name, quantity);
}

【问题讨论】:

  • 读行,从头找第一个空格,从结尾找第一个空格。

标签: c string file io format


【解决方案1】:

一种方法是使用fgets() 函数将整行读入一个字符数组,然后根据需要解析结果字符串。

在解析结果字符串时,读取第一个空格之前的第一个字符并将其存储为 ID 字符串。然后读取最后一个空格后的字符并转换为int。为此,您必须循环遍历 char 数组,同时使用 ctype 头文件中的库函数,例如 isspace()isdigit() 等。

【讨论】:

    【解决方案2】:

    您可以逐行阅读文件并使用split 划分部分:

    import std.stdio;
    import std.array;
    import std.conv;
    
    void main() {
        auto f = File("/tmp/file.txt", "r");
        foreach (line ; f.byLine()) {
            auto parts = line.split();
            string id = parts[0].to!string;
            string name = parts[1..$-1].join(' ').to!string;
            int quantity = parts[$-1].to!int;
    
            writeln("id ", id, " name ", name, " quantity ", quantity);
        }
    }
    

    【讨论】:

    • @gsamaras OP 想要c 还是d?它最初被标记为 d,而您将其编辑为 c,但我没有看到任何迹象表明它确实应该是 C 而不是 D。
    • rcorre 和支持您评论的人,请查看编辑历史记录。该帖子被 OP 标记为c。谢谢。
    • @gsamaras OP 被标记为 d,然后在 first edit 期间被重新标记为 c。我才意识到编辑不是你,但也不是 OP。
    • rcorre OP 的意思是说 C.d 没有fscanf(),我想。 ;) 但是你是对的,但我认为他错过了正确的标签。反正。 =)
    • D 可以访问 C 标准库,所以它是 does。不过,这不是推荐的方法,这就是为什么我提出不同的建议。最初的意图是什么是一个谜,但我想 OP 现在有各种各样的答案:)
    【解决方案3】:

    使用fgets()逐行读取文件。

    对每一行做:

    1. 通过搜索 first 空格获取 ID。
    2. 通过搜索 last 空格来获取字符串形式的数字。 使用atoi() 将其转换为整数。
    3. 该行的其余未处理部分是名称。

    下面是这个逻辑的一个简单而仓促的实现:

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    
    #define LEN 100
    
    int main(void)
    {
        char line[LEN];
        FILE* fp = fopen("foo.txt", "r");
        while (1) {
            if (fgets(line, 100, fp) == NULL) break;
            printf("%s", line);
            char id[20];
            int j = 0;
            while(line[j] != ' ' && line[j] != '\0')
            {
                id[j] = line[j];
                j++;
            }
            id[j] = '\0';
            //printf("ID: %s\n", id);
            j++;
            size_t len = strlen(line);
            int i, end = 0, k = 0;
            char str_number[20];
            for(i = len - 1; i >= 0; --i)
            {
                if(line[i] == ' ')
                {
                    end = i;
                    ++i;
                    while(i <= len)
                        str_number[k++] = line[i++];
                    break;
                }
            }
            //printf("%s\n", str_number);
            int number = atoi(str_number);
            //printf("%d\n", number);
            char name[20];
            k = 0;
            for(i = j; i < end; ++i)
                name[k++] = line[i];
            name[k] = '\0';
            printf("ID: %s\n", id);
            printf("Number: %d\n", number);
            printf("Name: %s\n", name);
        }
        return 0;
    }
    

    输出:

    Georgioss-MacBook-Pro:~ gsamaras$ gcc -Wall main.c 
    Georgioss-MacBook-Pro:~ gsamaras$ ./a.out 
    123456789 Dany Bany 1000
    ID: 123456789
    Number: 1000
    Name: Dany Bany
    999999999 Bill 9
    ID: 999999999
    Number: 9
    Name: Bill
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多