2017-02-23 139 views
0

我必须在C中的控制台中读取文件,该文件是一个CSV文件。我的代码如下:在C中读取CSV文件

printf("Ajouter un site internet \n"); 
     printf("------------------------------------------\n"); 
     FILE * curseur = fopen("listess.csv", "a"); 
     SITES * pSites = calloc(100000, sizeof(SITES)); 
     int i = 0; 
     int iSites = 0; 
     int champSites = 0; 
     char temp[1000]; 
     if (curseur != NULL) { 
      char c = fgetc(curseur); 
      while (c != EOF) { 
       printf("%s", (pSites + iSites)->url); 
       if (c != '\n' && c != ';') { 
        temp[i] = c; 
        i++; 
       } 

       else if (c == ';') { 
        temp[i] = '\0'; 
        if (champSites == 0) { 
         strcpy((pSites + iSites)->Commune, temp); 
         champSites++; 
         i = 0; 
        } 
        else if (champSites == 1) { 
         strcpy((pSites + iSites)->Insee, temp); 
         champSites++; 
         i = 0; 
        } 
        else if (champSites == 2) { 
         strcpy((pSites + iSites)->url, temp); 
         champSites++; 
         i = 0; 
        } 
        else if (champSites == 3) { 
         strcpy((pSites + iSites)->Population, temp); 
         champSites++; 
         i = 0; 
        } 
        else if (champSites == 4) { 
         strcpy((pSites + iSites)->https, temp); 
         champSites++; 
         i = 0; 
        } 
        else if (champSites == 5) { 
         strcpy((pSites + iSites)->Serveur, temp); 
         champSites++; 
         i = 0; 
        } 
        else if (champSites == 6) { 
         strcpy((pSites + iSites)->Version, temp); 
         champSites++; 
         i = 0; 
        } 
        else if (champSites == 7) { 
         strcpy((pSites + iSites)->Application, temp); 
         champSites++; 
         i = 0; 
        } 

        else if (champSites == 8) { 
         strcpy((pSites + iSites)->VersionApplication, temp); 
         champSites++; 
         i = 0; 
        } 
        else if (champSites == 9) { 
         strcpy((pSites + iSites)->Langage, temp); 
         champSites++; 
         i = 0; 
        } 
        else if (champSites == 10) { 
         strcpy((pSites + iSites)->VersionLangage, temp); 
         champSites++; 
         i = 0; 
        } 
        else if (champSites == 11) { 
         strcpy((pSites + iSites)->Latitude, temp); 
         champSites++; 
         i = 0; 
        } 
        else if (champSites == 12) { 
         strcpy((pSites + iSites)->Longitude, temp); 
         champSites++; 
         i = 0; 
        } 
       } 
       else { 
        iSites++; 
       } 
       c = fgetc(curseur); 
      } 
      system("pause"); 
      fclose(curseur); 
     } 

但我在控制台除了两个第一行有任何结果。 该文件由我在.h文件中声明的13列组成。

的CSV的5条第一线:

Commune;Code Insee;url;Population;https;Serveur;Version du serveur;Application;Version de l'application;Langage;Version du langage;Latitude;Longitude 
Argentat;19010;argentat.fr;3042;non;SiteW;2;Inconnue;Inconnue;php;5.3.29;45.100801186828598;1.934640270901890 
Canenx-et-Réaut;40064;mairie-info.com;175;non;SiteW;2;Inconnue;Inconnue;php;5.3.29;43.999060134922502;-0.464769980981436 
Chaussan;69051;chaussan.fr;972;non;SiteW;2;Inconnue;Inconnue;Inconnue;Inconnue;45.637283899086498;4.634069843807340 
Étrez;1154;etrez.fr;803;non;SiteW;2;Inconnue;Inconnue;Inconnue;Inconnue;46.338283686023097;5.192873875680920 
Gray ;70279;ville-gray.fr;6016;non;SiteW;2;Inconnue;Inconnue;php;5.2.10;47.432262030641297;5.610925314619960 
+0

请提供[MCVE] :强调MINIMAL – KevinDTimm

+0

请发布您的'listess.csv'文件的5-6首行。 –

+0

...和'fopen(“listess.csv”,“a”);'应该是'fopen(“listess.csv”,“r”);'。 –

回答

1

此:

   if (champSites == 0) { 
        strcpy((pSites + iSites)->Commune, temp); 
        champSites++; 
        i = 0; 
       } 
       else if (champSites == 0) { 
        strcpy((pSites + iSites)->Insee, temp); 
        champSites++; 
        i = 0; 
       } 

是没有意义的,注意,这两个条件都​​这显然意味着,大部分的代码是死的(将永远不会执行)。

也许应该是if 0 ... else if 1 ... else if 2等等。

2

您的代码过于复杂。扔掉它,并在此基础上新密码:

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

int main() 
{ 
    // declare and initialize your pSites stuff here 
    .... 
    // 

    if (curseur == NULL) 
    { 
    printf("Can't open file\n"); 
    return 1; 
    } 

    int linenumber = 1; 
    char buffer[1000]; 

    while (fgets(buffer, sizeof buffer, curseur)) 
    { 
    char *token = strtok(buffer, ";"); 
    printf("Line %d\n", linenumber++); 

    int column = 0; 
    while (token != NULL) 
    { 
     printf("%2d %s\n", column, token); 

     switch (column) 
     { 
     case 0: 
      strcpy((pSites + iSites)->Commune, token); 
      break; 

     case 1: 
      strcpy((pSites + iSites)->Insee, token); 
      break; 

     case 2: 
     .... etc. 
     } 

     token = strtok(NULL, ";"); 
     column++; 
    } 

    iSites++; 
    } 

    fclose(curseur); 
} 

BTW:不是写

(pSites + iSites)->Commune 

你应该写的更加易读的变体:

pSites[iSites]->Commune 
+0

比你非常,它的工作原理。但是我做得这么复杂,因为这个练习的目标是在csv的末尾添加一个网站。要实现服务器类型的统计信息(Apache/IIS ...)。并找到一个城市名称的网站。 –

+0

在CSV末尾添加新行是一个不同的问题,但您仍然可以使用该代码作为基础。 –

+0

谢谢,它运作良好:) 但是,我怎么能现在添加网址?请先生 –