簡體   English   中英

如何使用fgets()從CSV文件讀取值而不跳過數據?

[英]How to read values from a CSV file with fgets() without skipping data?

我正在嘗試讀取一個CSV文件,其中只有兩個用逗號分隔的值。 我正在使用char *fgets(char *str, int n, FILE *stream)函數讀取行。 在代碼中,為了完成do-while循環,我正在使用getc()方法讀取下一個字符,以了解是否已讀取文件的末尾。 問題是, getc()方法從下一行讀取第一個字符,因此我正在丟失數據(因為下一行的第一個數字丟失一位)。 如您所見,除了第一行之外,所有第一列條目都丟失了其第一個字符。

我應該使用什么來控制我的while循環? 還是我應該使用另一種方法從CSV文件讀取數據? 非常感謝你

來自my_file.csv的數據:

3.0000,4.0000,5.0000,6.0000,7.0000
6.0000,5.0000,4.0000,3.0000,2.0000
9.0000,6.0000,3.0000,0.0000,-3.0000
12.0000,7.0000,2.0000,-3.0000,-8.0000
15.0000,8.0000,1.0000,-6.0000,-13.0000
18.0000,9.0000,0.0000,-9.0000,-18.0000

實際輸出:

[在此處輸入圖片描述] [1]

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

void getData(char *buff);

int main() {

    char folder_addr[] = "C:\\my_file.csv";

    FILE *fp = fopen(folder_addr, "r");
    do  {
        char buff[1024];
        fgets(buff, 1024, (FILE*)fp);
        printf(buff);
        getData(buff);
    } while ((getc(fp)) != EOF);

    return 0;
};

void getData(char *buff){
    char *token = strtok(buff, ",");
    //printf("First value:  %s\n", token);

    while (token != NULL)   {
        //printf("First value:  %s\n", token);
        token = strtok(NULL, ",");
    }
}


  [1]: https://i.stack.imgur.com/fQzw1.jpg

替換您的do {fgets()...} while(getc); while (fgets()) {...}

最好的辦法是只執行while(fgets())而不是一會兒做。 我不會說偷看一個字符是最好的方法。

對於這樣做的合理選擇(如果存在這種情況),可以執行fseek(fp, -1, SEEK_CUR)返回上一步。 這有點難看,但還不錯,可以完成工作。 您需要像這樣重新排序:

while ((getc(fp)) != EOF) {
    fseek(fp, -1, SEEK_CUR);
    char buff[1024];
    fgets(buff, 1024, (FILE*)fp);
    printf(buff);
    getData(buff);
} 

但是,請注意,如果無法找到流(例如管道),則不能保證fseek正常工作。 最好使用ungetc 相同的原則。 您將剛剛讀取的字符放回流中。

類似的方法是這樣的:

int c;
while ((c = getc(fp)) != EOF) {
    char buff[1024];
    buff[0]=c;
    fgets(&buff[1], 1023, (FILE*)fp);
    printf(buff);
    getData(buff);
} 

您還應該將printf(buff)更改為puts(buff)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM