首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将文件详细信息读入字符串,以及int

将文件详细信息读入字符串,以及int
EN

Stack Overflow用户
提问于 2017-06-12 14:30:33
回答 3查看 59关注 0票数 1

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

代码语言:javascript
复制
123456789 Dany Bany 1000
999999999 Bill 9

我想阅读这些细节: ID到string,Name to string,number to int。

我该怎么做?我认为有两个字的名字,有些有一个字。我试着用这个词,但是两个单词的名字有问题:

代码语言:javascript
复制
while (fscanf(file, "%s %s %d", id, name, &quantity) > 0) {
    printf("%s %s %d\n", id, name, quantity);
}
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2017-06-12 16:54:01

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

每一行都要做:

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

下面是这个逻辑的天真和仓促的实现:

代码语言:javascript
复制
#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;
}

输出:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-06-12 15:48:22

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

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

票数 1
EN

Stack Overflow用户

发布于 2017-06-12 16:00:00

您可以逐行读取文件,并使用split来划分以下部分:

代码语言:javascript
复制
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);
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44501991

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档