【问题标题】:Passing char * into fopen with C使用 C 将 char * 传递给 fopen
【发布时间】:2010-03-19 02:51:29
【问题描述】:

我正在编写一个将数据从文件传递到数组的程序,但是我在使用 fopen() 时遇到了问题。当我将文件路径硬编码到参数中(例如fopen ("data/1.dat", "r");)时,它似乎工作正常,但是当我将它作为指针传递时,它返回NULL。

请注意,如果从命令行输入,第 142 行将打印“data/1.dat”,因此 parse_args () 似乎正在工作。

132 int
133 main(int argc, char **argv)
134 {
135   FILE *in_file;
136   int *nextItem = (int *) malloc (sizeof (int));
137   set_t *dictionary;
138
139   /* Parse Arguments */
140   clo_t *iopts = parse_args(argc, argv);
141
142   printf ("INPUT FILE: %s.\n", iopts->input_file); /* This prints correct path */
143   /* Initialise dictionary */
144     dictionary = set_create (SET_INITAL_SIZE);
145
146   /* Use fscanf to read all data values into new set_t */
147   if ((in_file = fopen (iopts->input_file, "r")) == NULL)
148   {
149     printf ("File not found...\n");
150     return 0;
151   }

谢谢! 里斯

更多:如果我在运行 set_create() (ln 144) 后尝试打印字符串,则不会打印字符串。 (但函数中根本没有对字符串的任何引用......)

 47 set_t *
 48 set_create(int size)
 49 {
 50   set_t *set;
 51
 52   /* set set_t members */
 53   set->items = 0;
 54   set->n_max = size;
 55   set->lock = FALSE;
 56
 57   /* allocate memory for dictionary input */
 58   set->data = (int *) malloc (size * sizeof (int));
 59
 60   return set;
 61 }

如果我在 fopen() 之后调用这个函数,它确实有效。 我看不出这对文件名有何影响...

再次感谢。

【问题讨论】:

  • 您是否检查过第 144 行没有以某种方式破坏名称?
  • 在 input_file 末尾嵌入空格、空值、换行符或其他任何看起来打印正确但会使 fopen barf 的内容?
  • 为了解决 Duck 的问题,我总是在 ' 中附上类似的测试打印。喜欢printf("Filename '%s'\n",p->name);
  • 尝试在 fopen 失败后再次打印路径..这将排除破坏(见某事的答案)。还可以尝试在 fopen 之后移动 set_create 函数调用(虽然如果这可行,它不是解决方案)。
  • 从我们现有的信息来看,这段代码应该可以正常工作。我们缺少什么?试着提炼出所有不相关的东西,你会找到罪魁祸首。

标签: c char fopen pass-by-reference


【解决方案1】:

您的新代码显示您正在写入无效内存。 set 是一个指针,但你从不初始化它。您正在覆盖一些随机内存,从而破坏了指向您传递给 fopen() 的字符串的指针。

【讨论】:

    【解决方案2】:

    您确定parse_args 工作正常吗?例如,如果它返回指向局部变量(或包含此类指针的结构)的指针,则 iopts->input_file 之类的值很容易被后续函数调用破坏。

    【讨论】:

    • 关于第 144 行如何引起麻烦的问题比我之前的要好。
    【解决方案3】:

    第二部分是你的问题。 set 未初始化。

    澄清一下:您正在修改您无意修改的内容,导致 fopen() 失败。

    【讨论】:

    • 没问题。这就是我们在这里的原因。 ;-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 2018-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多