从C中的文件中读取逗号分隔值

时间:2017-12-01 15:46:32

标签: c string file

我想读这个

                zeyad,aar,eee,100,sss,55,science
                toto,art,bb,100,ss,55,drawing

从文件中将其存储在books.title,books.publisher等结构中,如下所示

有人可以告诉我如何不读取逗号并将字符串存储在其位置?我尝试的是在每个字符串之间使用%* C,但它不起作用。

while (!feof(pBook))
{
    fscanf(pBook,"%s%*c%s%*c%s%*c%s%*c%s%*c%d%*c%s",
        books[z].Title,books[z].Author,books[z].Publisher,books[z].ISBN,books[z].DOP,
        &books[z].Copies,books[z].Category);
    fscanf(pBook,"\n");
    z++;
}
fclose(pBook);

2 个答案:

答案 0 :(得分:1)

一个简单的例子(未经测试):

void SeparateCommas(char *FileName)
{
 FILE *fd = fopen(FileName, "r");
 size_t len = 0;
 ssize_t read;
 char *line = NULL;
 char temp[50][32];
 char *token;
 char *end_str;

 while((read = getline(&line, &len, fd)) != -1)
    {
     printf("Read line: %s", line);
     token = strtok_r(line, ",", &end_str);

     while(token != NULL)
         {
          strncpy(temp[i], token, sizeof(temp[i]));
          printf("Read word: %s", temp[i]);
          token = strtok_r(NULL, ",", &end_str);
          i++;
         }
    }       
}

答案 1 :(得分:0)

  

有人可以告诉我如何不读取逗号,而只将字符串存储在其位置吗?

由于%s一个非空白字符序列匹配,因此不能用于不读取逗号。出于您的目的,可以使用%[…],它从一组预期字符( scanset )中匹配一个非空字符序列,字符 左括号后面是抑扬符(^),在这种情况下,扫描集包含所有 抑扬扬声符号和音调符号之间没有出现的字符 右括号

    while (fscanf(pBook, "%[^,],%[^,],%[^,],%[^,],%[^,],%d,%s\n",
            books[z].Title, books[z].Author, books[z].Publisher, books[z].ISBN,
            books[z].DOP, &books[z].Copies, books[z].Category) == 7) ++z;

我假设您确保输入文件中的所有字符串都适合为其各自的结构元素保留的大小,否则您将使用最大字段宽度