如何读取文件并将每个readed行拆分为变量或数组

时间:2014-05-05 05:13:53

标签: c string file split

大家好,并且事先非常感谢,我在这里尝试的是用ansi C读取文件,这个文件包含文本,每行包含一个像这样的字符串:

andreuga|460325945878913024|Y sorry por los que no querían pero ITESO ahí te voy|1398585232|0|0 

我正在做的是读取file.txt并将该字符串拆分为此输出:

res[0] = andreuga
res[1] = 460325945878913024
res[2] = Y sorry por los que no querÝan pero ITESO ahÝ te voy
res[3] = 1398585232
res[4] = 0
res[5] = 0
res[6] = (null)

所以我想要做的是读取文件并在读取每一行时拆分字符串并将该值保存到结构中,以便稍后我可以使用该结构并插入到具有我的另一个函数的数据库中。但我的主要问题是在从文件中读取每一行时拆分字符串。这是代码:

#include <string.h>

int main(){
    char    str[]= "andreuga|460325945878913024|Y sorry por los que no querían pero ITESO ahí te voy|1398585232|0|0";
    char ** res  = NULL;
    char *  p    = strtok (str, "|");
    int n_spaces = 0, i;


    /* split string and append tokens to 'res' */

    while (p) {
      res = realloc (res, sizeof (char*) * ++n_spaces);

      if (res == NULL)
        exit (-1); /* memory allocation failed */

      res[n_spaces-1] = p;

      p = strtok (NULL, "|");
    }

    /* realloc one extra element for the last NULL */

    res = realloc (res, sizeof (char*) * (n_spaces+1));
    res[n_spaces] = 0;

    /* print the result */

    for (i = 0; i < (n_spaces+1); ++i)
      printf ("res[%d] = %s\n", i, res[i]);

    /* free the memory allocated */

    free (res);

    return 0;
}
///////////////////////OUTPUT:
res[0] = andreuga
res[1] = 460325945878913024
res[2] = Y sorry por los que no querÝan pero ITESO ahÝ te voy
res[3] = 1398585232
res[4] = 0
res[5] = 0
res[6] = (null)

另外要提到的是,在这里我尝试加入这两个代码失败了。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include "libpq-fe.h"

#define LONG_MAX_LINEA  1024
#define NOM_ARCHIVO  "twitsDB.txt"


typedef struct tweet
{
 int  IDTweet;
 char IDCreator[20];
 char IDSentimentAnalysis[20];
 char HashTag[141];
 char Content[141];
 char CreationDate[30];    // time.h!!!
 char Retweet[20];
 char Favorites[20];
}Tweet;

int main(void)
{
   FILE *entrada;
   char linea[LONG_MAX_LINEA];

   char str[200];
   char ** res  = NULL;
   char *  p    = strtok (str, "|");
   int n_spaces = 0, i;
   int j = 0;

   printf("\n programa para leer una archivo");
   printf("\n-------------------------------");

   if ((entrada = fopen(NOM_ARCHIVO, "r")) == NULL){
      perror(NOM_ARCHIVO);
      return EXIT_FAILURE;
   }

   //Tweet tweet1;
   while (fgets(linea, LONG_MAX_LINEA, entrada) != NULL)
   {
      printf("%d %s", j,linea);


      //
        str[j] = linea;
        /* split string and append tokens to 'res' */

        while (p) {
          res = realloc (res, sizeof (char*) * ++n_spaces);

          if (res == NULL)
            exit (-1); /* memory allocation failed */

          res[n_spaces-1] = p;

          p = strtok (NULL, "|");
        }

        /* realloc one extra element for the last NULL */

        res = realloc (res, sizeof (char*) * (n_spaces+1));
        res[n_spaces] = 0;

        /* print the result */

        for (i = 0; i < (n_spaces+1); ++i)
          printf ("res[%d] = %s\n", i, res[i]);

        /* free the memory allocated */

        free (res);
      //

//      strcpy(tweet1.Content, "prueba tweet");
//      strcpy(tweet1.IDCreator, "1");
//      strcpy(tweet1.Favorites, "1");
//      strcpy(tweet1.Retweet, "1");
//      strcpy(tweet1.CreationDate, "2014-01-01");
//      strcpy(tweet1.HashTag, "1");
//      strcpy(tweet1.IDSentimentAnalysis, "1");



      //insertTweet(tweet1);
      // llenar la struct tweet

        j++;
        break;
   }


   fclose(entrada);
   puts("eso es todo el archivo");

   return EXIT_SUCCESS;
}

希望我能够达到目的,如果不是我不断寻求更好的解释。 干杯。

2 个答案:

答案 0 :(得分:2)

那很奇怪...... 你声明str(第77行):

char str[200];

然后你将strtok应用于str上的垃圾值(因为你没有初始化它)......(第79行)

char *  p    = strtok (str, "|");

然后在没有正确启动变量的情况下使用p(第101行):

    while (p) {

也许问题就在那边?

<强> ============================================ ==

修改

首先,您似乎正在尝试在str中保存linea,因此,您需要将str的声明更改为:

char str[LONG_MAX_LINEA];

因为您需要确保目标字符串有足够的空间。

然后你不能尝试分配 str [j] = linea; 这是错误! 因此该行应更改为:

strcpy(str,linea);

其次,没有必要将strtok转换为垃圾值,因此将p声明更改为:

char *  p    = NULL;

然后,在此之前,你写道:

p = strtok (str, "|");

现在有用吗?

答案 1 :(得分:0)

我修复了错误但没有正常工作

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include "libpq-fe.h"

#define LONG_MAX_LINEA  1024
#define NOM_ARCHIVO  "twitsDB.txt"


typedef struct tweet
{
    int  IDTweet;
    char IDCreator[20];
    char IDSentimentAnalysis[20];
    char HashTag[141];
    char Content[141];
    char CreationDate[30];    // time.h!!!
    char Retweet[20];
    char Favorites[20];
} Tweet;

int main(void)
{
    FILE *entrada;
    char linea[LONG_MAX_LINEA];

    char str[LONG_MAX_LINEA];
    char ** res  = NULL;
    char *  p    = NULL;
   // char *  p    = strtok (str, "|");

    int n_spaces = 0, i;
    int j = 0;

    printf("\n programa para leer una archivo");
    printf("\n-------------------------------");

    if ((entrada = fopen(NOM_ARCHIVO, "r")) == NULL)
    {
        perror(NOM_ARCHIVO);
        return EXIT_FAILURE;
    }
    //Tweet tweet1;
    p = strtok (str, "|");
    while (fgets(linea, LONG_MAX_LINEA, entrada) != NULL)
    {
        printf("%d %s", j,linea);
        //
        strcpy(str,linea);
        /* split string and append tokens to 'res' */

        while (p)
        {
            res = realloc (res, sizeof (char*) * ++n_spaces);

            if (res == NULL)
                exit (-1); /* memory allocation failed */
            res[n_spaces-1] = p;
            p = strtok (NULL, "|");
        }

        /* realloc one extra element for the last NULL */

        res = realloc (res, sizeof (char*) * (n_spaces+1));
        res[n_spaces] = 0;

        /* print the result */

        for (i = 0; i < (n_spaces+1); ++i)
            printf ("res[%d] = %s\n", i, res[i]);

        /* free the memory allocated */

        free (res);
        //

//      strcpy(tweet1.Content, "prueba tweet");
//      strcpy(tweet1.IDCreator, "1");
//      strcpy(tweet1.Favorites, "1");
//      strcpy(tweet1.Retweet, "1");
//      strcpy(tweet1.CreationDate, "2014-01-01");
//      strcpy(tweet1.HashTag, "1");
//      strcpy(tweet1.IDSentimentAnalysis, "1");
        //insertTweet(tweet1);
        // llenar la struct tweet
        j++;
        break;
    }
    fclose(entrada);
    puts("eso es todo el archivo");

    return EXIT_SUCCESS;
}