从C中的文件读取时忽略不必要的字符

时间:2015-05-04 12:29:00

标签: c file struct

我有一个编程任务,提供一个数据文件“candidatesdata.txt” 您应该阅读信息并解读名称,性别,身高和体重。唯一的问题是每个数据记录之间的名称和逗号都有引号。该文件如下:

Name,Gender,Height,Weight
"Tanner, Mark C.”,M,71.8,180.25
"Jinglehiemmerschmitt, John J.”,M,70.75,185.3
"Parker, Sarah J.",F,65.25,120.3

..续

如何阅读数据记录并忽略引号和逗号? 这是我到目前为止,它删除了一些逗号和引号,但在删除名称的过程中。

#include <stdio.h>

struct candidateinfo
{
    char name[50];
    char gender;
    double height;
    double weight;
}candidate;


    int main()
{
    int count =0;
    FILE *candidate_data;


    // Open file
    candidate_data = fopen("/Users/moisestrevino/Documents/CS 1324/Assignment #5/Assignment #5/candidatedata.txt","r");

    fscanf(candidate_data, "%*[^\n]");
    fgetc(candidate_data);

    // Get rid of unecessary letters

      while (count<40)
      {
          count++;

         fscanf(candidate_data,"\"%[^\"],%c,%lf,%lf\n", candidate.name, &candidate.gender, &candidate.height, &candidate.weight);

          printf("%s %c %lf %lf\n",candidate.name, candidate.gender, candidate.height, candidate.weight);
      }

    fclose(candidate_data);
    return 0;

 }

输出:

     Tanner, Mark C.  0.000000 0.000000
,M,71.8,180.25
  0.000000 0.000000
Jinglehiemmerschmitt, John J.  0.000000 0.000000
,M,70.75,185.3
  0.000000 0.000000
Parker, Sarah J.  0.000000 0.000000
,F,65.25,120.3
  0.000000 0.000000
Meeks, Kalvin R.  0.000000 0.000000
,M,57.25,210.2


cont...

2 个答案:

答案 0 :(得分:0)

您的代码包含许多问题。有太多要提,所以这里有修复:

如果文件包含以下格式的数据:

Name,Gender,Height,Weight

然后,

"Tanner, Mark C.",M,71.8,180.25
"Jinglehiemmerschmitt, John J.",M,70.75,185.3
"Parker, Sarah J.",F,65.25,120.3

然后下面的修复将会解决。

fopen之后,您可以使用

fscanf(candidate_data, "%*[^\n]");
fgetc(candidate_data);

第一行扫描并丢弃所有内容,直到换行符。第二行使用换行符。在此之后,使用

fscanf(candidate_data, " \"%[^\"]\",%c,%lf,%lf", name, gender, height, weight);

假设您已经声明了一个名为char的{​​{1}}数量相当大的数组,名称为name的{​​{1}}和名称char gender 1}}和double,以下是上述height的细分:

  • weight(空格)扫描并丢弃所有空白字符,直到第一个非空白字符。
  • fscanf扫描文件中的并将其丢弃。
  • \"扫描所有内容,直到"并将其存储在%[^\"]
  • "扫描文件中的name并将其丢弃。
  • \"扫描并丢弃逗号。
  • "扫描角色并将其存储在,
  • %c扫描并丢弃逗号。
  • gender扫描,并将其存储在%lf
  • double扫描并丢弃逗号。
  • height扫描,并将其存储在%lf

现在您可以打印每个值。通过将上面的double置于循环中来阅读更多数据。

但是你怎么知道数据何时结束?检查weight的返回值。 fscanf返回成功匹配和分配的输入项的数量,可以少于提供的数量,或者在早期匹配失败的情况下甚至为零。

在您的情况下,如果成功扫描了所有数据,fscanf将返回4。所以,只需阅读数据,直到fscanf没有返回4。

<小时/> 正如@chux所建议的那样,您可以使用

来防止缓冲区溢出
fscanf

49告诉fscanf扫描fscanf(candidate_data, " \"%49[^\"]\",%c,%lf,%lf", name, gender, height, weight); 最多49个字符(NUL终止符为+ 1)

答案 1 :(得分:0)

如果每一行包含所有字段,则可以改为使用str(r)chr + atof,例如

char line[100];
while( fgets(line,100,candidate_data) )
{
  char *p = strrchr(line,',');
  weight = atof(p+1); *p=0;
  p = strrchr(line,',');
  height = atof(p+1);
  gender = *--p;
  *strrchr(line,'"')=0;
  strcpy( name, strchr(line,'"')+1 );
}