fopen()在c

时间:2018-02-24 20:16:19

标签: c fopen

出于某种原因,fopens在我的程序中不断崩溃。

当我读取输入文件并将内容放入变量时,它会工作一次。但出于某种原因,当我试图让它再次使用fopens时,它会崩溃......

有人可以帮忙吗

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *buf = "\0";
char buffer[99999] ;

int main(int argc, char *argv[])
{
ptr_file =fopen(inputFileLocation,"r");
    if (!ptr_file)
    {
        return 1;
    }
    while (fgets(buf,maxvalue, ptr_file)!=NULL)
    {
        strcat(buffer,buf);     
    }
    fclose(ptr_file);
... //workings
//then the program crashes if I add an fopen() and fclose() at the end

}

2 个答案:

答案 0 :(得分:1)

接受的答案忽略了这一点。它不仅仅是关于缓冲区溢出。 maxvalue = 2;没有缓冲区溢出,但程序将崩溃。

但是一步一步:

fgets(buf, maxvalue, ptr_file) != NULL

  

C库函数char *fgets(char *str, int n, FILE *stream)   从指定的流中读取一行并将其存储到字符串中   由str指出。当读取(n-1)个字符时,它会停止   读取newline字符,或达到end-of-file,   以先到者为准。自动附加null个字符   读取字符后的str表示C string的结束。

在您的情况下,buf是大小为2的字符串文字。这很可能对您的需求而言太小。 但它不仅仅是buf的大小!

您无法将任何内容复制到(常量)字符串文字!即使您读取了一个字符,该操作也会使用信号11使您的程序崩溃。

常量是指程序在执行期间不会改变的固定值。这些固定值也称为文字。

您需要的是适当大小的char array

您可以使用与char buffer[99999]

相同的方式声明它
// 1.
char buf[SIZE_OF_THE_BUF];  // remember that buf has to accept maxvalue-1 characters + `null` character

或在main()

中为其动态分配内存
//  2.a
char *buf;
// 
int main()
{
  // 2.b
  buf = malloc(maxvalue * sizeof(char));
 //...
} 

答案 1 :(得分:0)

您创建一个名为buf的指针,指向包含单个字符&#39; \ 0&#39;的空格。 然后使用fgets()尝试读取未知数量的字符(您不会显示maxvalue是什么)到buf指向的空间。但那个空间只有一个字符长。读入它会占用空间,造成不确定的行为。