C - 将文本文件中的行存储在结构中

时间:2018-02-03 18:38:29

标签: c struct

我从C编程开始,我在学校项目中遇到了这个问题。 我有一个合同的文本文件,如下所示:

609140307   Carla Aguiar Cunha Paredes Pires    PT 309 181 020 533 713 02F  13.8
814991297   Ricardo Andrade Nogueira Matos  PT 099 597 635 807 514 05D  10.35
843818099   Eduardo Carneiro Paredes Clementino Castro  PT 829 961 009 571 587 02D  5.75
647507641   Cristiana Eanes Almada Martins Baptista PT 257 687 479 093 378 02E  10.35
684741046   Marisa Calado Cardoso Quadros Barbosa   PT 722 479 016 817 208 0RC  10.35
...

字段由标签分隔,大约有10,000行合约

我需要将每一行存储到结构中。这就是我所做的:

#include <stdio.h>

typedef struct {
    char id_contract[10];
    char name[60];
    char id_local[26];
    char power[5];
}CONTRACTS;

void main() {
    CONTRACTS c[10000] = { 0 };
    int i = 0;
    FILE *file = fopen("contracts.txt", "r");
    if (file)
    {
        char line[120];
        while (fgets(line, sizeof line, file) && i < 5)
        {

            if (sscanf(line, "%9s%60s%26s%5s",
                c[i].id_contract,
                c[i].name,
                c[i].id_local,
                c[i].power) == 4)
            {
                printf("Contract ID = %s\n", c[i].id_contract);
                printf("Name = %s\n", c[i].name);
                printf("Local ID = %s\n", c[i].id_local);
                printf("Power = %s\n", c[i].power);
                ++i;
            }
        }
     else {
        printf("Error!\n");
    }
}

这是我得到的输出:

Contract ID = 609140307
Name = Carla
Local ID = Aguiar
Power = Cunha
Contract ID = 814991297
Name = Ricardo
Local ID = Andrade
Power = Nogue
Contract ID = 843818099
Name = Eduardo
Local ID = Carneiro
Power = Pared

所以基本上这是按空格分隔字段,我不知道如何通过标签将其分开。我是初学者,所以对我来说很难。提前谢谢!

3 个答案:

答案 0 :(得分:1)

在你的typedef中更正最后两个变量:

char id_local[27];
char power[6];

然后,你的sscanf应该是:

sscanf(line, "%9c %[^\t] %26c %5s",
            c[i].id_contract,
            c[i].name,
            c[i].id_local,
            c[i].power) != 0)
        {

因为名称是长度可变的。

立即尝试;)

答案 1 :(得分:0)

你可以做的是使用read()函数来读取每个字节,并检查你正在读取的字节是否等于\t的ASCII值,这是制表的字符。

char byte;
int file_descriptor= open("filename.txt", O_RDNLY, 0555);
while(1){
 int test = read(file_descriptor, &byte, 1);
 if(test == -1) {
   perror("Read");
   exit(errno);//errno is any value but you can import errno from errno.h
 }
 if(test == 0) break;
 /*add the byte to the specific field of your struct*/
}

这对我来说是一个很好的解决方案,因为你每个字节读取你的文件字节,每个字节对应一个字符。 当你读\n时,请不要伪造,这意味着你已经读完了你正在读的那条线。

答案 2 :(得分:0)

好吧,伙计们现在正在工作。归功于@WeatherVane和@StefanoFormicola。 这就是我改变了

char line[120];
        while (fgets(line, sizeof line, file) && i < 20) /*This 20 is just to read 20 lines*/
        {

            if (sscanf(line, "%9c %[^\t] %26c %6c",
                c[i].id_contract,
                c[i].name,
                c[i].id_local,
                c[i].power) != 0)
            {
                printf("Contract ID = %s\n", c[i].id_contract);
                printf("Name = %s\n", c[i].name);
                printf("Local ID = %s\n", c[i].id_local);
                printf("Power = %s\n", c[i].power);
                ++i;
            }

这是我的输出:

Contract ID = 609140307
Name = Carla Aguiar Cunha Paredes Pires
Local ID = PT 309 181 020 533 713 02F
Power = 13.8

Contract ID = 814991297
Name = Ricardo Andrade Nogueira Matos
Local ID = PT 099 597 635 807 514 05D
Power = 10.35

Contract ID = 843818099
Name = Eduardo Carneiro Paredes Clementino Castro
Local ID = PT 829 961 009 571 587 02D
Power = 5.75

非常感谢你们!