0

好吧,我整天都在做这件事,我这辈子都无法理解,也许你们可以帮忙。我有一个文件,内容如下

1301,105515018,"水手长","迈克尔 R.",ABC, 123,="R01"

1301,103993269,"卡斯蒂利亚","小迈克尔",ABC, 123,="R03"

1301,103993267,"卡斯蒂利亚","珍妮丝",ABC, 123,="R03"

1301,104727546,"Bonczek","克劳德",ABC, 123,="R01"

1301,104731479,"克鲁兹","阿基姆迈克",ABC, 123,="R01"

1301,105415888,"Digiacomo","斯蒂芬",ABC, 123,="R02"

1301,106034479,"Annitto Grassis","苏珊",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");

}

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

获取 lastname 字符串,因为它最多为 15 个字符,它会溢出到它之后的名字字符串,并获取它需要的剩余字符以填充 lastname char 数组。显然我不想要这个。如您所见,我尝试过 strtok 但它没有做任何事情,但不确定我必须做什么,因为我以前从未使用过它。也尝试过将所有变量都包含到 fscanf 语句中,但我要么得到相同的输出,要么变得一团糟。实际上,我非常迷茫,如何将这些值放入它们所属的变量中?!

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

4

5 回答 5

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解释终止字符 '\0'。

于 2014-06-04T07:25:53.670 回答
2

你有一个带引号的字符串的 CSV 文件,所以我建议你使用 CSV 解析器(或滚动你自己的)而不是尝试全部使用scanf(因为scanf无法处理引号,例如引号字符串中的逗号)。一个快速的谷歌搜索出现了libcs​​v.c,你可以在你的项目中使用它。

于 2013-03-01T03:08:09.667 回答
1

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

阅读POSIX 2004scanf手册— 或POSIX 2008/2013 版本— 并回答这个问题,你就会对你应该做的事情有所了解。甚至fscanf代码也应该assert用作调试辅助,以确保读取的项目数是正确的。

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

于 2013-03-01T03:15:24.837 回答
0

1.有语法错误

while(result != NULL){

      printf(".....);

      ......

}

}//error
  1. fscanf(inputf, "%s", lastname); 看不懂一行,fscanf遇到空格就会停下
于 2013-03-01T03:04:43.307 回答
0

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

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

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

.... //对 term、id、lastname、firstname 做一些事情——把它们放在一个学生结构中

}

有关 regex 的更多信息, Jeff Friedl 的Mastering Regex是一本学习该主题的好书。

于 2013-03-01T04:55:39.263 回答