从文件C中的单行读取多个变量类型

时间:2013-03-01 02:15:15

标签: c string file input strtok

好吧,我整天都在这里,不能因为我的生活得到这个,也许你的家伙可以帮助。我有一个文件,内容如下

  

1301,105515018,“Boatswain”,“Michael R。”,ABC,123,=“R01”

     

1301,103993269,“Castille”,“Michael Jr”,ABC,123,=“R03”

     

1301,103993267,“Castille”,“Janice”,ABC,123,=“R03”

     

1301,104727546,“Bonczek”,“Claude”,ABC,123,=“R01”

     

1301,104731479,“Cruz”,“Akeem Mike”,ABC,123,=“R01”

     

1301,105415888,“Digiacomo”,“Stephen”,ABC,123,=“R02”

     

1301,106034479,“Annitto Grassis”,“Susan”,ABC,123,=“R04”

     

1301,106034459,“Als”,“Christian”,ABC,123,=“R01”

这是我的代码......

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

#define MAX_NAME 15
#define MAX_SUBSEC 3
#define N 128

//void printArr(struct *students);

struct student{

int term;
int id;
char lastname[MAX_NAME];
char firstname[MAX_NAME];
char subjectname[MAX_SUBSEC];
int catalog;
char section[MAX_SUBSEC];

}students[10];

int main(){

int term;
int id;
char lastname[MAX_NAME];
char firstname[MAX_NAME];
char sub[MAX_SUBSEC];
int cat;
char sec[MAX_SUBSEC];

char fname[N];
FILE *inputf;

printf("Enter the name of the text file: ");
scanf("%123s",fname);

strcat(fname,".txt");

inputf = fopen(fname,"r");

if (inputf == NULL){

     printf("I couldn't open the file for reading.\n");
     exit(0);

}
//TROUBLE HERE!

fscanf(inputf, "%d,%d,%[^,]s", &students[0].term, &students[0].id,students[0].lastname);

printf("%d\n", students[0].term);

printf("%d\n", students[0].id);

printf("%s\n", students[0].lastname);

/*for (j = 1 ; j <= 10-1 ; j++){

    for(k = 0 ; k <= 10-2 ; k++){

        if(students[k] > students[k+1]){

            temp = students[k];
            students[k] = students[k+1];
            students[k+1] = temp;

            }
        }
    }*/

fclose(inputf);

system("pause");

return 0;

}

void printArr(int a[], int tally){

int i;

for(i = 0 ; i < tally ; i++){

 printf("%d ", a[i]);

}

printf("\n");

}

我的目标是在文本文件中取出每个值并将其输入到struct所属的结构中,然后输入struct数组,但我无法通过前2个int。

获取lastname字符串,因为它最多包含15个字符,它会溢出到它后面的第一个名称字符串中,并获取所需的剩余字符以填充lastname char数组。显然我不想要这个。正如你所看到的,我已经尝试了strtok,但它没有做任何事情,不知道我必须做什么,虽然我以前从未使用过它。也尝试过将所有变量都包含在fscanf语句中,但是我要么得到相同的输出,要么变得一团糟。事实上,我非常迷失,如何将这些值纳入它们所属的变量中?!

编辑:更新了我的代码,我已经有点远但不多了。我现在可以打印出姓氏,但不能再远离那里,我无法获得firstname字符串或超出它的任何变量。

5 个答案:

答案 0 :(得分:2)

你所拥有的是带引号字符串的CSV文件,所以我建议你使用CSV解析器(或自己动手)而不是尝试用scanf完成所有操作(因为scanf无法处理引号,例如引用字符串中的逗号)。您可以在项目中使用快速Google搜索libcsv.c

答案 1 :(得分:2)

使用fscanf格式字符串"%d,%d,\"%[^\"]\",\"%[^\"]\",%[^,],%d,=\"%[^\"]\"",我们可以读取整行的数据。此外,你必须定义

char lastname[MAX_NAME+1];
char firstname[MAX_NAME+1];
char subjectname[MAX_SUBSEC+1];
int catalog;
char section[MAX_SUBSEC+1];

- +1代表终止&#39; \ 0&#39;字符。

答案 2 :(得分:1)

我有一个问题...如果你想知道如何使用钻石切割机,你试试看,或者你参考手册?这里的问题不是您选择的结果,而是您自己的选择。信不信由你,我经常回答这些问题,以至于我厌倦了重复自己。答案全在手册中。

阅读the POSIX 2004 scanf manual - 或POSIX 2008/2013 version - 以及答案this question,您就会明白自己应该做的事情。即使fscanf代码也应使用assert作为调试辅助工具,以确保读取的项目数量正确无误。

%[^,]s好像这里有一个错误。也许你的意思是%[^,]%[格式说明符是%s格式说明符的不同格式说明符,因此在可能错误的代码中有两个指令:%[^,]ss指令告诉scanf读取's'并将其丢弃。

答案 3 :(得分:0)

1.

中存在语法错误
while(result != NULL){

      printf(".....);

      ......

}

}//error
  1. fscanf(inputf, "%s", lastname);无法读取一行,fscanf会在遇到空格时停止

答案 4 :(得分:0)

fscanf一次读取一行,并且您可以轻松捕获每行的内容,因为您的文件格式非常好,特别是由于逗号分隔(如果您的任何分隔值都不包含逗号,则非常有用)。

你可以传递fscanf格式,就像你正在使用“%d”来捕获一个int,“%s”来捕获一个字符串(在空白处结束,例如试图找到一个名字时会厌倦这个比如文件的当前读取行中的“Annitto Grassis,需要2%s”等。您可以更高级并使用正则表达式模式来定义要捕获为chars的内容,例如“Boatswain”,a序列包含来自集合{AZ},{az}和{“}的字符。你需要扫描文件直到你到达终点(由C中的EOF表示),这样你就可以这样做并捕获行的内容并适当地将值分配给变量,如下所示:

  

while(fscanf(inputf,“%d,%d,%[\”A-Za-z],%[\“A-Za-z。]”,&amp; term,&amp; id,lastname, firstname)!= EOF){

     

.... //用term,id,lastname,firstname做一些事情 - 把它们放在学生结构中

     

}

有关正则表达式的更多信息,Jeff Friedl的掌握正则表达式是了解该主题的好书。