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



好吧,我已经做了一整天了,我一辈子都不能把它记下来,也许你们可以帮忙。我有一个文件,如下

1301105515018,"Boatswain","Michael R.",ABC,123,="R01">

130110393269,"Castille","Michael Jr",ABC,123,="R03">

130110393267,"Castille","Janice",ABC,123,="R03">

1301104727546,"Bonczek","Claude",ABC,123,="R01">

1301104731479,"Cruz","Akeem Mike",ABC,123,="R01">

1301105415888,"Digiacomo","Stephen",ABC,123,="R02">

1301106034479,"Annito Grassis","Susan",ABC,123,="R04">

1301106034459,"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("%dn", students[0].term);
printf("%dn", students[0].id);
printf("%sn", 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");
}

我的目标是在文本文件中获取这些值中的每一个,并将其输入到结构中的相应位置,然后输入到结构数组中,但我无法获得前2个int。

获取lastname字符串,因为它最多有15个字符,所以它会溢出到它后面的名字字符串中,并获取所需的剩余字符,以填充lastname char数组。显然我不想这样。正如你所看到的,我尝试过strtok,但它没有任何作用,尽管我不确定我必须做什么,因为我以前从未使用过它。我也尝试过将所有变量都包含在fscanf语句中,但我要么得到相同的输出,要么就变得一团糟。事实上,我非常困惑,我如何将这些值转化为它们所属的变量?!

编辑:更新了我的代码,我走得更远了一点,但不多。我现在可以只打印姓氏,但不能再打印了,我无法找到名字字符串或它之外的任何变量。

您所拥有的是一个带有引号字符串的CSV文件,因此我建议您使用CSV解析器(或滚动自己的解析器(,而不是尝试使用scanf来完成这一切(因为scanf无法处理引号,例如引号字符串中的逗号(。在谷歌上快速搜索就会找到libcsv.c,你可以在项目中使用它。

使用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来解释终止的"\0"字符。

我有个问题要问你。。。如果你想知道如何使用金刚石刀具,你是试试看,还是查阅手册?这里的问题不是你选择的结果,而是你的选择本身。信不信由你,我经常回答这些问题,以至于我厌倦了重复自己。答案都在手册里。

阅读POSIX 2004 scanf手册或POSIX 2008/2013版本,回答这个问题,你就会知道你没有做什么,你应该做什么。即使是fscanf代码也应该使用assert作为调试辅助工具,以确保读取的项目数是正确的。

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

1.中存在语法错误

while(result != NULL){
      printf(".....);
      ......
}
}//error
  1. fscanf(inputf, "%s", lastname);无法读取一行,fscanf遇到空格时将停止

fscanf一次读取一行,您可以轻松地捕获每一行的内容,因为您的文件格式非常好,尤其是由于逗号分隔(如果分隔的值中没有逗号,则非常有用(。

您可以像使用"%d"一样传递fscanf格式来捕获int,"%s"来捕获字符串(以空格结尾,例如,当试图从文件的当前读取行中找到像"Annitto Grassis"这样的名称时,请对此感到厌倦,这将需要2%的%s(等。您可以更高级,并使用正则表达式模式将要捕获的内容定义为字符,例如"Boatswain",这是一个由集合{a-Z}、{a-Z}和{"}中的字符组成的序列。您需要扫描文件,直到到达末尾(用C中的EOF表示(,这样您就可以这样做,并捕获行的内容,并将值适当地分配给变量,如:

while(fscanf(inputf,"%d,%d,%[\"A-Za-z],%[\"A-Za-z.]",&term,&id,lastname,firstname(!=EOF({

//对term、id、lastname、firstname做点什么——把它们放在学生结构中

}

有关正则表达式的更多信息,Jeff Friedl的《掌握正则表达式》是一本学习该主题的好书。

相关内容

  • 没有找到相关文章

最新更新