在c中保存第一个文件

时间:2018-01-16 23:22:26

标签: c

我的代码部分有问题,我正在尝试读取文件的行,只剪切每行的第一个字,然后将其保存在数组中。

示例:

  

两条道路以黄色木头分开

     

抱歉我无法旅行

     

和我站在一个旅行者

     

并尽可能地向下看了一眼

     

它在灌木丛中弯曲的地方

因此我希望像这样的矢量:“两个,和,和,到”

但我得到了这个:“to,to,to,to,to”。

我的代码

dictionary *load_word(int autor, dictionary *D_first)
{
  FILE *date;
  char line[LONG_MAX_LINE];
  char exeption[4] = " \n\t";
  char *word;
  int j=0;
  if (autor == 1)
  {
     if ((date = fopen("test.txt", "r")) == NULL)
     {
        perror("robert_frost.txt");

     }
     while (fgets(line, LONG_MAX_LINE, date ) != NULL)
     {   
        word = strtok(line, exeption); /*first word*/
        add_dictionary_first(D_first, j, word);
       j++;
     }

    fclose(date);
  }
  return D_first;  
}

void add_dictionary_first(dictionary *D, int cont, const char *value)
{
  expand_dictionary(&D, 1);
  D->Distribution[D->size-1]->cont = cont;
  D->Distribution[D->size-1]->value = value;
}

1 个答案:

答案 0 :(得分:1)

问题在于这一行(正如莫斯科的Vlad在评论中所说):

D->Distribution[D->size-1]->value = value;

这只是指针赋值。这本身并没有错,但取决于 上下文,它不是你想要的。

while (fgets(line, LONG_MAX_LINE, date ) != NULL)
{   
    word = strtok(line, exeption); /*first word*/
    add_dictionary_first(D_first, j, word);
    ...
}

在此,您始终使用相同的变量add_dictionary_first致电line。它是 一个数组,但数组在作为参数传递时会衰减为指针 功能。这意味着您的所有D->Distribution[D->size-1]->value都指向 同一个地方。输入文件的最后一行以to开头,这就是为什么你只能获得 to

您需要使用strcpy复制字符串。

  

man strcpy

#include <string.h>

char *strcpy(char *dest, const char *src);
     

strcpy()函数复制src指向的字符串,包括终止字符串   空字节('\0'),指向的缓冲区   dest。字符串可能不重叠,目标字符串dest必须是   大到可以收到副本。

因为你没有发布结构我只能猜测value是 声明为char*(如果编译器会抱怨char[])。

选项1

D->Distribution[D->size-1]->value = malloc(strlen(value) + 1); // note the +1 here
if(D->Distribution[D->size-1]->value == NULL)
{
    // error handling
}
strcpy(D->Distribution[D->size-1]->value, value);

选项2

如果您的系统中有strdup

D->Distribution[D->size-1]->value = strdup(value);
if(D->Distribution[D->size-1]->value == NULL)
{
    // error handling
}

在任何一种情况下,您都必须稍后释放内存。