好吧,我整天都在这里,不能因为我的生活得到这个,也许你的家伙可以帮助。我有一个文件,内容如下
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字符串或超出它的任何变量。
答案 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
格式说明符的不同格式说明符,因此在可能错误的代码中有两个指令:%[^,]
和s
。 s
指令告诉scanf
读取's'并将其丢弃。
答案 3 :(得分:0)
1.
中存在语法错误while(result != NULL){
printf(".....);
......
}
}//error
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的掌握正则表达式是了解该主题的好书。