我试图用fopen打开文件,并为“霍夫曼树”进行读写操作。 阅读完文字后,我尝试在另一个文件中写“字典”,说每个字母的代码是什么。 我有一个错误,就是我发现找不到类似的东西,只是原因是日食的旧版本,但这不是问题。 我在ubuntu中使用eclipse在c中进行编程。

主要是这样的:

int main(){
    FILE *fsrc;
    node *root;
    if( (fsrc  = fopen( "src.txt", "r" )) == NULL ){ //
        printf( "The file 'src.txt' was not opened\n" );
        return 0;
    }
    else {
        printf( "The file 'src.txt' was opened\n" );
    }
    root = getBinTree(fsrc);
    printTree(&(*root));
    huffman(root); 
    return 0;
}

这是写入目标文本的功能

void printhtree(node *n,FILE *trg){
       char *str = calloc(1, sizeof(char));
       node *ptr=n;
       while (!(ptr->m_hls && ptr->m_hrs)){
           while(ptr->m_hls){
               n=ptr;
               ptr = ptr->m_hls;
               str = realloc(1,sizeof(char)*(strlength(str)+1));
               *(str+strlength(str)-1)='0';
           }//while
           if(!(ptr->m_hrs)){
               printf("%s-%c ",str,ptr->m_ch);
               n->m_hls = NULL;
               return;
           }//if
           while(ptr->m_hrs){
               n=ptr;
               ptr = ptr->m_hrs;
               str = realloc(1,sizeof(char)*(strlength(str)+1));
               *(str+strlength(str)-1)='1';
           }//while
       }//while
       if (!(ptr->m_ch)){
           fputc(ptr->m_ch,trg);
           fputc(' ',trg);
           fputs(str,trg);

           n->m_hls = NULL;
           return;
       }//if
   }//printhtree

这是激活“ pringhtree”功能的功能:

  ‪void drawTree(node *n,FILE *trg‬‬){
        while(!(n))
           printhtree(n,trg);
   }

错误出现在绘制树的第一行:“ void drawTree(node * n,FILE *trg‬‬)”,它说:“此行上的多个标记错误字符序列在程序中遇到了流浪'\\ 252',并且与数字254,342,200相同的行。

在程序的开头我写了所有函数的名称时,也存在相同的错误。

非常感谢你

===============>>#1 票数:2

这是代码中的重要问题

str = realloc(1,sizeof(char)*(strlength(str)+1));

出于很多原因

  1. 语法错误,因为这是您正在重新realloc()地址0x01
  2. 您不应该立即覆盖指针,因为如果发生错误,那么您将无法恢复,良好使用realloc()就像

     void *tmp = realloc(str, 1 + strlength(str)); if (tmp != NULL) str = tmp; 
  3. 这是没有错的,但是它会使您的代码不必要地丑陋, sizeof(char)保证为1

  4. 大概strlength()模仿strlen() ,因此您不想strlength()计算长度,将其存储并使用该值。

  5. 您第一次使用malloc()分配空间,但是由于滥用了代码中的realloc() ,因此完全删除了该指针,此外,除了在写入指向的数据之前,您实际上不需要分配空间,因此可以替换将您的realloc()malloc()删除,并删除calloc() ,通过不必要的方式将所有值初始化为0 ,则不需要。

  6. 您仅初始化设置为'\\0'str的最后一个值,但其余数据仍未初始化,因为如果正确使用了,则实际上分配内存的函数将是realloc() ,特别是因为calloc()正在分配一个字节。

  ask by Roy Ancri translate from so

未解决问题?本站智能推荐:

2回复

在Eclipse中运行时,C fopen无法打开文件。

我在使用fopen打开文件以在Eclipse中读取时遇到问题。 我要打开的文件与所有程序文件位于同一目录中,它具有所有授予的权限。 但是程序找不到该文件。 在试图仅使用文件名(无路径)打开文件的程序中: 我获得具有所有权限的同一目录中现有文件的“无法打开文件:文件名”。
1回复

使用flock()锁定使用fopen()打开的文件

这个问题已经在这里有了答案: 如何使用fopen()锁定文件? 6个答案 我正在使用公司中某人为Linux编写的旧C / C ++代码。 代码使用fopen()打开文件,然后使用flock()锁定文件: 问题是,当我在Linux上使用Eclipse编译代
1回复

Linux中的fopen(Lubuntu)在文件存在时返回NULL

我在使用Oracle的VirtualBox的虚拟机中在Lubuntu上运行它。 我认为这不会影响任何事情,但我认为值得一提。 看起来错误是从附加到由以下函数返回的字符串末尾的奇怪符号出现的: 我看不出这个函数的问题,因此认为它可能是由存储在变量中的数据引起的。 我一直在尝试
2回复

使用fopen在C中重复打开文件

我有一个关于“fopen”功能的问题。 我可以说pFile1 == pFile2吗? 此外,FILE类型可以用作地图的关键吗? 谢谢!
1回复

C-使用fopen在函数内部打开文件

我正在使用Visual Studio 2005(C \\ C ++)。 我正在将字符串作为char数组传递给函数。 我想打开作为参数传入的文件并使用它。 我知道我的代码在一定程度上可以正常工作,因为如果我将文件名作为第一个参数进行硬编码,它就可以正常工作。 我确实注意到,如果我将
3回复

C程序fopen()无法打开文件

我了解,有成千上万的此类问题,但我还没有找到解决问题的方法。 这是代码: 无论我做什么,是否都将main.cpp和exe文件放到同一文件夹中,并使其设置为FILE *inputFile=fopen("main.cpp","R"); 或指定绝对路径,我一直都显示“无法找到源文件”。
4回复

C在打开文件时对fopen()进行编程

我一直在想这个。 我读过的大多数书籍都显示,当您打开文件时,发现文件不存在,您应该提出一个错误,即没有这样的文件,然后退出系统... 但是我认为,与其相反,当发现打开的文件不存在时,为什么不自动创建一个新文件。 即使您不会在使用该程序时在文件上进行写操作(但下次会使用它)。 我不确
2回复

在C中使用带有相同标志的fopen打开文件

我无法理解这段代码的输出? OUTPUT是mytext文件中的hello 。 为什么不写? “无法”不打印到标准输出 。
2回复

fopen没有打开文件

我很确定这是打开文件的方法: 所以,我在我的工作目录中。 编译时,会在文件所在的位置创建可执行文件。 我做了一个put来比较文件的名称。 文件名(关于终端中显示的内容是相同的); 我将“r”切换为“r +”,我仍然得到我的文件不存在。 此外,我做了fopen(“actualFi
2回复

fopen可以创建文件,但不能在C中重新打开文件

我无法打开我刚刚使用fopen()创建的文件,我在Linux和Windows上都尝试了此代码。 我也使用完整路径尝试了此代码。