2013-03-25 60 views
-1

我正在维护计算机专业学生的集合的数据库进行简单的注册系统。每个学生记录包含从文件中读取7个变量(每个变量1号线),并分配给结构变量

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

struct student 
{ 

    char name[300]; 
    int age; 
    char course_1[40]; 
    char course_2[40]; 
    char *remarks; 

}; 

struct course 

{ 

    char course_title[200]; 
    int cse_num[100]; 
    char instructor[200]; 
    char date[50]; 
    char start_time[50]; 
    char end_time[50]; 
    char location[50]; 

}; 


main() 

{ 

    int i; 
    struct course data[11]; 
    FILE *f; 
    char title[100]; 
    int num[100]; 
    char instructor[100]; 
    char date[100]; 
    char start_time[100]; 
    char end_time[100]; 
    char location[100]; 
    char line[300]; 

    f = fopen("course.dat", "r"); 


    i=0; 


    while(*fgets(line, 300, f) != '\n') 

    { 
     sscanf(line, "%99[^\n]", num); 
     sscanf(line, "%99[^\n]", title); 
     sscanf(line, "%99[^\n]", instructor); 
     sscanf(line, "%99[^\n]", date); 
     sscanf(line, "%99[^\n]", start_time); 
     sscanf(line, "%99[^\n]", end_time); 
     sscanf(line, "%99[^\n]", location); 

     data[i].cse_num = num // doesn't work 

     strcpy(data[i].course_title, title); 
     strcpy(data[i].instructor, instructor); 
     strcpy(data[i].date, date); 
     strcpy(data[i].start_time, start_time); 
     strcpy(data[i].end_time, end_time); 
     strcpy(data[i].location, location); 


     i++; 


    } 

    fclose(f); 


} 

我的问题是如何在输入需要从文件,因为它是7行,直到一个新行考虑。我尽我所能解释这一点,谢谢你,如果你可以尝试帮助我的家伙!我真的专注于这一点,只是不能说实话。这是文件:

示例输入:

CSE1001 
Research Directions in Computing 
Wildes, Richard 
W 
16:30 
17:30 
VC 135 
+0

我建议重新标记您的问题到c – apomene 2013-03-25 19:05:23

+0

1.你提供看起来并不像C#2可怕的格式(请您在使用橙色问号的代码发布以了解如何格式化)3.巨大的文本墙。不要发布整个程序,不要发布整个文件。发布相关的代码和简要的输入示例。 4.你还没有自己尝试过这个问题,但你或者 – tnw 2013-03-25 19:05:52

+0

你的代码喜欢c,但你用c#来关闭它。你在说什么语言? – evgenyl 2013-03-25 19:06:55

回答

1

不要忘了,你还必须strcpy(data[i].course_title, title);

而且也适用于所有字符串。

您目前正在做这件事:data[i].course_title = title;

+0

非常感谢!我试图弄清楚为什么它早些时候给我一个错误。 – geforce 2013-03-25 19:38:49

0

考虑使用scanf。这是一个通用函数,用于解析来自终端或来自具有fscanf变体的文件的输入。它已经是你将要包括的库的一部分,并且格式与printf类似,你将使用很多的程序输出。

+0

对于多字字符串(作业标题等),'fgets()'可能更好,虽然换行之前需要从字符串剪切换行符通过'strcpy()'。 – 2013-03-25 19:34:38

0

你误报的main()

struct course 
{ 
    char course_title[200]; 
    int cse_num[100]; 
    char instructor[200]; 
    char date[50]; 
    char start_time[50]; 
    char end_time[50]; 
    char location[50]; 
} 

main() 
{ 

这是说main()返回struct course。这是错误的。

  1. 在结构后面添加一个分号。
  2. 始终为每个函数提供显式类型。 C99要求它;对于C89来说这是一个好习惯。

的代码应该开始:

struct course 
{ 
    char course_title[200]; 
    int cse_num[100]; 
    char instructor[200]; 
    char date[50]; 
    char start_time[50]; 
    char end_time[50]; 
    char location[50]; 
}; 

int main(void) 
{ 

你应该从你的C编译器对这个错误得到警告。如果你不是,你需要打开警告或者你需要一个更好的编译器。

这可能与您面对的其他问题直接相关,但应该是固定的。

+0

嗨,我设置了早些时候..由于我刚刚参加这个论坛,它搞砸了。 – geforce 2013-03-25 19:39:20

+0

请注意'sscanf(line,“%s”,title);'只将'计算研究方向'中的'研究'这个单词读入标题。您需要将换行符修剪掉,并将其复制到结构中的“标题”中。同样的教练名字。 (或者你可以使用'sscanf(line,“%99 [^ \ n]”,title)',它可以读到一个换行符,只有99个字符值得避免缓冲区溢出。)你可以直接读入结构体,避免一层复制:'sscanf(line,“%99 [^ \ n]”,data [i] .course_title);'。每次都应该检查sscanf()操作是否成功。 – 2013-03-25 19:43:32

+0

非常感谢乔纳森,我现在要试试这个。 – geforce 2013-03-25 19:52:09