2016-12-13 505 views
1

我对这段代码有点麻烦。我有一个文件products.csv,我试图读取和存储在结构中的值。有一行是使用fscanf()从csv文件中读取C

Book,B123,The Hunt for Red October,12.99,28

因为标题中有空格,我知道我需要使用[^,]代替%s所以fscanf()不会在空格停止,但它搞乱了文件的读取我不知道如何解决它。代码如下:

typedef struct { 
    char productType[15]; 
    char productID[4]; 
    char productDescription[100]; 
    double productPrice; 
    int quantityInStock; 
} product_t;  

int main() { 
    product_t product1; 

    read_products(&product1); 
} 

int read_products(product_t *product) { 
    FILE *inFile = fopen("products.csv", "r"); 

    fscanf(inFile, "%[^,] %[^,] %[^,] %lf %d", product->productType, product->productID, product->productDescription, product->productPrice, product->quantityInStock); 

    printf("%s %s %s %lf %d", product->productType, product->productID, product->productDescription, product->productPrice, product->quantityInStock); 
} 
+0

另一种方法是逐行读取文件,并使用'strtok()'来解析它。 – RichouHunter

+0

你尝试过使用'fgets'吗? – RoadRunner

+2

'fscanf(inFile,“%[^,]%[^,]%[^,]%lf%d”,product-> productType,product-> productID,product-> productDescription,&product-> productPrice, > quantityInStock);'。注意int&float的路过地址 –

回答

3

您在逗号后面强制空格,并且不解析逗号。改变这种

"%[^,] %[^,] %[^,] %lf %d" 

到这一点:

"%[^,],%[^,],%[^,],%lf,%d" 

其他的是,你有更多的错误:

  • productID[4]你需要5个字符数组来容纳为\0终止。

  • productPricequantityInStock不是指针,所以在scanf你需要通过自己的指针(&product->productPrice&product-> quantityInStock

检查工作的例子here

+0

更改后程序停止工作。如果我这样做''%[^,],%[^,],%[^,]%lf%d“'它在某种程度上起作用。出于某种原因,第二个'[^,]'仍然应该是第三个部分的一部分。 –

+0

啊,没有意识到我忘了在productID中适应endline。这很有效,非常感谢! –

+0

基本上是正确的 - 你已经诊断出基本问题,并且大多修复了它。您可以使用前导空白来跳过初始空白(例如,来自前一个输入的新行)。你应该在逗号后面和'%[^,]'之前放一个空格。你应该在'%lf'之后的逗号前加一个空格。因此,我建议:''%[^,],%[^,],%[^,],%lf,%d“'。 (狡猾的问题:你能解释为什么这些改变是有益的吗?)。请注意,基于行的输入('fgets()')和字符串扫描('sscanf()')可能是好的。检查'scanf()'家族函数的返回值。 –