首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从C文件中的单行读取多个变量类型

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

Stack Overflow用户
提问于 2013-03-01 02:15:15
回答 5查看 4.2K关注 0票数 0

好吧,我一整天都在做这件事,我一辈子都不能把它弄下来,也许你们这些家伙能帮上忙。我有一个文件,内容如下

1301,105515018,"Boatswain","Michael .“,ABC,123,="R01” 1301,103993269,"Castille","Michael“,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“

这是我的密码..。

代码语言:javascript
复制
#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数组的位置,但我无法传递前两个it。

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

编辑:更新了我的代码,我得到了一些更远,但没有太多。我现在可以打印出姓,但不能再离那里更远,我不能接触到名字字符串或其他任何变量。

EN

回答 5

Stack Overflow用户

发布于 2013-03-01 03:08:09

这里有一个带有引号的CSV文件,因此我建议您使用CSV解析器(或自己的),而不是使用scanf (因为scanf不能处理引号,例如引号中的逗号)。快速的谷歌搜索可以找到libcsv.c,你可以在你的项目中使用它。

票数 2
EN

Stack Overflow用户

发布于 2014-06-04 07:25:53

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

代码语言:javascript
复制
char lastname[MAX_NAME+1];
char firstname[MAX_NAME+1];
char subjectname[MAX_SUBSEC+1];
int catalog;
char section[MAX_SUBSEC+1];

-说明终止“\0”字符的+1

票数 2
EN

Stack Overflow用户

发布于 2013-03-01 03:15:24

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

读一读手册 -或者POSIX 2008/2013版 -和答案这个问题,你就会知道你不应该做什么。即使是fscanf代码也应该使用assert作为调试辅助工具,以确保读取的项数是正确的。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15149330

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档