我正在尝试从 FILE* 中读取一串文本,但每次尝试时都会遇到分段错误。这是我在程序中唯一要做的事情,所以我不太确定为什么会这样。
#include <stdio.h>
int main(){
FILE* file;
char* string;
file = fopen("practice.txt", "r");
fgets(string, 100, file);
printf("%s", string);
return 0;
}
您还没有为您的字符串分配任何内存。您可以使用malloc为字符串分配内存,或使用数组char string[100];
请务必分配内存来存储您要阅读的内容:
char string[101];
那是因为string
未初始化。string
是 achar *
并且最初将垃圾值保存为地址,该地址被fgets
函数取消引用,从而导致未定义的行为。
要么做
char string[BUFFER_LEN];
并BUFFER_LEN
适当定义
或者做
char *string;
string = malloc (sizeof (char) * buf_siz);
其中buf_siz
保存缓冲区的长度。当您动态分配字符串时,请记住,free (string)
当您完成使用分配的内存块时malloc
,这是一个很好的做法,并且可以防止较大程序中的内存泄漏。
始终通过检查 的返回值来检查文件是否已成功打开fopen
。如果它返回NULL
,则打开操作失败。否则它将返回FILE
指针。
char *string
声明一个指针,但没有将它设置为指向任何有意义的地方;您还没有分配任何内存来存储从文件中读取的文本。
您要么需要分配一个数组,如下所示:
char string[101] = {0};
...
fread(string,100,file);
printf("%s\n", string);
或在运行时分配内存:
char *string;
...
string = calloc(101, sizeof *string);
if (string)
{
fread(string,100,file)
printf("%s\n", string);
free(string);
}
在这两种情况下,我们都为 101 个字符分配了足够的内存来解释 0 终止符,并且由于fread
不会将 0 终止符写入输入的末尾,因此我们在两种情况下都将内存初始化为全位为零(第一个由使用初始化程序,第二个调用calloc
)。