2011-06-13 84 views
-1

如何将文件中的数据读取到结构中? 我有这样从文件中读取数据

struct data 
{ 
    char name[20]; 
    int age; 
}; 

在文件student_info.txt的结构我有

ravi 12 raghu 14 datta 13 sujay 10 rajesh 13 

等与年龄等其他名称。我怎样才能从文件读取结构数据?

读这个名字和年龄应该是一个循环,即我第一次阅读'ravi'和'12',那么我应该将这些数据打包在结构中,并且只要结构设置。它应该回到文件,并阅读'raghu'和'14'再次用这个数据打包结构,这应该是一个循环,直到我读取文件中的所有数据

任何人都可以请告诉如何执行逻辑?

+3

功课?....... – 2011-06-13 06:00:02

+1

幸运的是,你可以使用'scanf()的'这一点,只要你细心限制名字读至19个字符(留下一个用于长度null在字符串的末尾),并检查来自'scanf()'的返回状态。 – 2011-06-13 06:20:38

+0

由于您的程序是从文件输入的,因此您可能需要使用'fscanf'。 – 2011-06-13 21:37:38

回答

0

你只需要从这个文件中读取数据并根据一些标准分割该字符串。由于您的文件格式不正确,您将难以解析数据。

在您当前的场景中,您的文件只包含名字和数字,您可以通过检测字符串中的空格字符来轻松解析该数字。但是如果你的任何名字包含空格,这可能会导致问题。

首先用一些字符分隔每一对单词,如:或;或者制表符或换行符。 然后在每个分隔的字符串之间按空格分隔,然后读取char数组中的所有文件内容,然后从该数组中尝试查找指示一条记录的特殊字符。 分开在不同的字符数组的每个记录然后为每个生成的阵再次,然后把它分解基于空间char和负载在你的结构

这只是为了说明,原有的实现可能是不同的,

Student std = {first string, second integer}; 

希望该文件解决您的问题http://www.softwareprojects.com/resources//t-1636goto.html

+0

@DumbCode:如果存储在文件中的数据运行到几个K字节,该怎么办?我们需要分配一个大小的数组,在这段代码中,我只给出了5个年龄相应的名字,如果我有1000个名字和千年的年龄那么该怎么办? – raghavan 2011-06-13 06:22:54

+0

或者他可以像Jonathan Leffler所建议的那样做,并且使用带'%s'和'%d'说明符的'scanf'。这根本不是“困难的”。 – Marlon 2011-06-13 06:27:48

+0

看到它取决于您的要求。如果您想要阅读的数据量较大,而不是完整阅读,则需要优化阅读。阅读本文件希望能够解决您的问题 http://www.softwareprojects.com/resources//t-1636goto.html – 2011-06-13 06:31:13

1

的方法是:

  1. 创建一个实例文件访问的文件指针和计数器变量
  2. 使用文件指针打开文件流 - 检查它是否已成功打开。如果fopen()失败,文件指针将指向NULL
  3. 使用循环将数据读入结构数组。 fscanf()函数返回的成功“匹配”的数量与它的格式字符串 - 这将是2(用这个循环条件)
  4. 关闭文件

代码的一个例子:

#include <stdio.h> 

#define FILENAME "student_info.txt" 
#define MAX_NO_RECORDS 50 

struct data 
{ 
char name[20]; 
int age; 
}; 

int main(void) 
{ 
    /* Declare an array of structs to hold information */ 
    struct data StudentInfo[MAX_NO_RECORDS]; 
    /* Declare a file pointer to access file */ 
    FILE *s_info; 
    int student_no = 0; /* holds no. of student records loaded */ 

    /* open the file for reading */ 
    s_info = fopen(FILENAME, "r"); 
    /* Check if an error has occured - exit if so */ 
    if(s_info == NULL) 
    { 
     printf("File %s could not be found or opened - Exiting...\n", FILENAME); 
     return -1; 
    } 

    printf("Loading data...\n"); 
    while(fscanf(s_info, "%19s %i", StudentInfo[student_no].name, &StudentInfo[student_no].age) == 2) 
    { 
     /* refer to records with index no. (0 to (1 - no. of records)) 
      individual members of structure can be accessed with . operator */ 
     printf("%i\t%-19s %3i\n", student_no, StudentInfo[student_no].name, StudentInfo[student_no].age); 
     student_no++; 
    } 
    /* after the loop, student_no holds no of records */ 
    printf("Total no. of records = %i\n", student_no); 
    /* Close the file stream after you've finished with it */ 
    fclose(s_info); 

    return 0; 
}