调用函数传递另一个结构作为参数后,结构的元素会失去其值

维尼修斯·弗雷塔斯

我有一个我不知道的问题。我有以下文件:file_reader.c, file_reader.h, file_writer.c, file_writer.h, test_file_reader.c

我正在使用“结构”来读写文件。为了更好地理解,我编写了以下代码test_file_reader.c

#include <stdio.h>
#include "file_reader.h"
#include "file_writer.h"

int main ()
{   
    char *file_path = "/home/freitas/Dropbox/projects/gcleaner/cleaners/custom.xml";
    struct FileReader *fr = malloc(sizeof(struct FileReader));

    file_reader_new (file_path, fr);    

    show_file_reader_values(fr);

    struct FileWriter *fw = malloc(sizeof(struct FileWriter));

    fw->file_path = "/tmp/text1.txt";
    fw->content = "aaa";
    write (fw);

    show_file_reader_values(fr);

    return 0;
}

void show_file_reader_values(const struct FileReader *fr)
{
    printf("==========FILE READER==========\n");    
    printf("file path: %s\n", fr->file_path);
    printf("----------file content---------\n");    
    printf("content:\n%s\n", fr->content);
    printf("----------file content---------\n");
    printf("n lines: %d\n", fr->n_lines);
    printf("n characters: %d\n", fr->n_characters); 
    printf("==========FILE READER==========\n\n");
}

函数“ file_reader_new”读取文件,然后在“结构”“ FileReader”上签名内容,文件路径,行数和字符数。

当我第一次调用函数“ show_file_reader_values”时,内容没有问题,但是当我调用函数“ write”,然后再次调用函数“ show_file_reader_values”时,内容不再相同。问题是文件“ file_writer.c”及其结构的“写”功能与文件“ file_reader”及其结构没有任何关系。那么,使用另一个结构的函数如何更改另一个文件的另一个结构的值?

输出:

[freitas@localhost test]$ ./test_file_reader 
==========FILE READER==========
file path: /home/freitas/Dropbox/projects/gcleaner/cleaners/custom.xml
----------file content---------
content:
<cleaner>  <id>k3b</id>  <label>k3b</label>  <description>Disc writing software</description>  <option>  <id>log</id>  <label>Log</label>  <description>Delete the log file which contains information about the last writing session(s).</description>  <command>delete</command>  <search>glob</search>  <path>~/.kde/share/apps/k3b/*.log</path>  </option>  <option>  <id>log2</id>  <label>Log</label>  <description>Delete the log file which contains information about the last writing session(s).</description>  <command>delete</command>  <search>glob</search>  <path>~/.kde/share/apps/k3b/*.log</path>  </option>  </cleaner>

----------file content---------
n lines: 1
n characters: 621
==========FILE READER==========

==========FILE READER==========
file path: /home/freitas/Dropbox/projects/gcleaner/cleaners/custom.xml
----------file content---------
content:
<cleaner>  <id>k��U�N
----------file content---------
n lines: 1
n characters: 621
==========FILE READER==========

你有没有看到 ?在第一个电话中,我有整个输出:

<cleaner>  <id>k3b</id>  <label>k3b</label>  <description>Disc wri...

但是在第二个电话中,我有:

<cleaner>  <id>k��U�N

file_reader.c

#include <stdio.h>
#include <stdlib.h>
#include "file_reader.h"

int file_reader_new(const char *file_path, struct FileReader *fr)
{
  char    *content;      // holds the file content.
  int     counter;           // holds the file number of lines.
  size_t  i;             // indexing into content.
  size_t  buffer_size;   // size of the content.
  char    *temp;         // for realloc().
  char    c;             // for reading from the input.
  FILE    *input;        // our input stream.

  if ((input = fopen(file_path, "r")) == NULL) {
    fprintf(stderr, "Error opening input file %s\n", file_path);
    exit(EXIT_FAILURE);
  }

  /* Initial allocation of content */
  counter = 0;
  i = 0;  
  buffer_size = BUFSIZ;
  if ((content = malloc(buffer_size)) == NULL) {
    fprintf(stderr, "Error allocating memory (before reading file).\n");
    fclose(input);
  }

  while ((c = fgetc(input)) != EOF) {

    /* Enlarge content if necessary. */
    if (i == buffer_size) {
      buffer_size += BUFSIZ;
      if ((temp = realloc(content, buffer_size)) == NULL) {
        fprintf(stderr, "Ran out of core while reading file.\n");
        fclose(input);
        free(content);
        exit(EXIT_FAILURE);
      }
      content = temp;
    }

    /* Add input char to the content. */
    content[i++] = c;

    /* If the character is a break of line
     * then the counter will be incremented.
     */
    if (c == '\n')
      counter++;
  }

  /* Test if loop terminated from error. */
  if (ferror(input)) {
    fprintf(stderr, "There was a file input error.\n");
    free(content);
    fclose(input);
    exit(EXIT_FAILURE);
  }

  /* Make the content a bona-fide string. */
  if (i == buffer_size) {
    buffer_size += 1;
    if ((temp = realloc(content, buffer_size)) == NULL) {
      fprintf(stderr, "Ran out of core (and only needed one more byte too ;_;).\n");
      fclose(input);
      free(content);
      exit(EXIT_FAILURE);
    }
    content = temp;
  }
  content[i] = '\0';

  /* Assigns the variables to the corresponding
   * element of the struct.
   */
  fr->file_path = file_path;
  fr->content = content;
  fr->n_lines = counter;
  fr->n_characters = i;

  /* Clean up. */
  free(content);
  fclose(input);

  return 0;
}

file_reader.h

#ifndef FILE_READER_H_
#define FILE_READER_H_

typedef struct FileReader
{
    char *content;           // holds the file content.
    char *file_path;     // holds the file path.
    int  *n_lines;           // holds the number of lines.
    int  *n_characters;  // holds the number of characters.
} FileReader;

// file_reader_new - reads the file
int file_reader_new(const char *file_path, struct FileReader *fr);

#endif

file_writer.c

#include <stdio.h>
#include "file_writer.h"

void write (struct FileWriter *fw)
{
  FILE *f = fopen(fw->file_path, "w");
  if (f == NULL)
  {
      printf("Error opening file!\n");
      exit(1);
  }

  fprintf(f, "%s", fw->content);   

  fclose(f);
}

file_writer.h

#ifndef FILE_WRITER_H_
#define FILE_WRITER_H_

typedef struct FileWriter
{
    char *file_path;
    char *content;
    int  *error;
} FileWriter;

#endif

你能帮助我吗 ?谢谢!

维尼修斯·弗雷塔斯
struct FileReader *fr = malloc(sizeof(struct FileReader)); 

不需要这样做。您需要的是:

struct FileReader fr; 

同样在这里:

struct FileWriter fw; 

然后只需将这些变量的地址传递给必需的函数即可。


请注意,这并不是作为答案提供给您的,只是作为注释来清理您的代码以除去对堆的不必要的调用。碰巧的是,真正的问题存在于其他地方,而您在这里看到的是undefined behavior全部荣耀。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将指针传递给在另一个结构内部声明的结构作为函数参数?

来自分类Dev

ctypes-调用库函数传递另一个库调用产生的结构

来自分类Dev

将open调用作为参数传递给另一个函数后,文件对象是否关闭?

来自分类Dev

内存泄漏-如何为在另一个结构中作为线程参数传递的Typdef结构分配内存?

来自分类Dev

如何调用在另一个函数中作为参数传递的函数

来自分类Dev

我想将一个函数的返回值作为python中另一个函数的参数传递

来自分类Dev

将具有自己的参数作为变量的SwiftUI视图传递给另一个视图结构

来自分类Dev

如何从函数返回值,该值作为JavaScript中的参数传递给另一个函数?

来自分类Dev

如何从函数返回值,该值作为JavaScript中的参数传递给另一个函数?

来自分类Dev

我可以将函数调用作为参数传递给另一个函数吗?Python

来自分类Dev

将结构按值传递给另一个函数会将其初始化为零

来自分类Dev

如何将可变函数参数作为参数传递给另一个函数?

来自分类Dev

如何传递具有参数作为另一个函数的参数的函数指针?

来自分类Dev

将函数参数作为参数传递给python中的另一个函数

来自分类Dev

如何将参数传递给作为另一个函数参数的函数

来自分类Dev

直接在 C 中将函数的返回(和调用)作为另一个参数直接传递

来自分类Dev

将数组(作为函数参数传递)元素复制到 JavaScript 中的另一个本地数组中

来自分类Dev

是否可以将一个属性值作为参数传递给通过函数计算其值的另一个属性?(在带有类的Javascript ES6中)

来自分类Dev

将匿名函数作为唯一参数传递给另一个函数(C ++)

来自分类Dev

节点度量执行时间-作为参数传递给另一个函数的异步返回值

来自分类Dev

如何将一个函数作为参数传递给Perl中的另一个函数,然后调用它?

来自分类Dev

在另一个函数中使用修改后的结构

来自分类Dev

从另一个JS文件和节点目录结构调用函数

来自分类Dev

将函数输出作为参数传递给另一个函数

来自分类Dev

将匿名多行函数作为参数传递给另一个函数

来自分类Dev

Ti基本传递函数作为另一个函数的参数

来自分类Dev

如何将tanh函数作为参数传递给另一个函数?

来自分类Dev

将模板化函数作为参数传递给另一个函数

来自分类Dev

将函数返回作为参数传递给另一个函数

Related 相关文章

  1. 1

    如何将指针传递给在另一个结构内部声明的结构作为函数参数?

  2. 2

    ctypes-调用库函数传递另一个库调用产生的结构

  3. 3

    将open调用作为参数传递给另一个函数后,文件对象是否关闭?

  4. 4

    内存泄漏-如何为在另一个结构中作为线程参数传递的Typdef结构分配内存?

  5. 5

    如何调用在另一个函数中作为参数传递的函数

  6. 6

    我想将一个函数的返回值作为python中另一个函数的参数传递

  7. 7

    将具有自己的参数作为变量的SwiftUI视图传递给另一个视图结构

  8. 8

    如何从函数返回值,该值作为JavaScript中的参数传递给另一个函数?

  9. 9

    如何从函数返回值,该值作为JavaScript中的参数传递给另一个函数?

  10. 10

    我可以将函数调用作为参数传递给另一个函数吗?Python

  11. 11

    将结构按值传递给另一个函数会将其初始化为零

  12. 12

    如何将可变函数参数作为参数传递给另一个函数?

  13. 13

    如何传递具有参数作为另一个函数的参数的函数指针?

  14. 14

    将函数参数作为参数传递给python中的另一个函数

  15. 15

    如何将参数传递给作为另一个函数参数的函数

  16. 16

    直接在 C 中将函数的返回(和调用)作为另一个参数直接传递

  17. 17

    将数组(作为函数参数传递)元素复制到 JavaScript 中的另一个本地数组中

  18. 18

    是否可以将一个属性值作为参数传递给通过函数计算其值的另一个属性?(在带有类的Javascript ES6中)

  19. 19

    将匿名函数作为唯一参数传递给另一个函数(C ++)

  20. 20

    节点度量执行时间-作为参数传递给另一个函数的异步返回值

  21. 21

    如何将一个函数作为参数传递给Perl中的另一个函数,然后调用它?

  22. 22

    在另一个函数中使用修改后的结构

  23. 23

    从另一个JS文件和节点目录结构调用函数

  24. 24

    将函数输出作为参数传递给另一个函数

  25. 25

    将匿名多行函数作为参数传递给另一个函数

  26. 26

    Ti基本传递函数作为另一个函数的参数

  27. 27

    如何将tanh函数作为参数传递给另一个函数?

  28. 28

    将模板化函数作为参数传递给另一个函数

  29. 29

    将函数返回作为参数传递给另一个函数

热门标签

归档