【问题标题】:Reading Comma Separated Values from File in C从 C 中的文件中读取逗号分隔的值
【发布时间】:2017-12-01 15:46:32
【问题描述】:

我想看这篇

                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);

【问题讨论】:

  • 你能给我举个例子,使用上面的语句,我该如何扫描它?因为我还是个初学者
  • 如何在没有这些分隔符的情况下从行中读取每个字符串
  • 谁或什么文字建议while (!feof(pBook)) { ... }

标签: c string file


【解决方案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++;
         }
    }       
}

【讨论】:

  • With strncpy(temp[i], token, sizeof(temp[i])); printf("Read word: %s", temp[i]); 为什么使用有限制的字符串副本,然后可能打印一个没有空字符的数组?
【解决方案2】:

谁能告诉我如何不读取逗号而只在其位置存储字符串?

由于%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;

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

【讨论】:

    猜你喜欢
    • 2014-12-14
    • 1970-01-01
    • 1970-01-01
    • 2016-09-28
    • 2012-06-13
    • 2020-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多