C 需要帮助找出fgets的问题所在吗
所以基本上我有一个指向一个文件的文件指针,这个文件有80个介于0和1之间的数字,我需要把它们转换成一个字符串,然后用它做一些事情 函数返回C 需要帮助找出fgets的问题所在吗,c,null,fgets,file-pointer,C,Null,Fgets,File Pointer,所以基本上我有一个指向一个文件的文件指针,这个文件有80个介于0和1之间的数字,我需要把它们转换成一个字符串,然后用它做一些事情 函数返回NULL,我找不到错误所在,因为如果它返回NULL,则表示错误 FILE *fpr = fopen(path, "r"); FILE *fpw = fopen("code.txt", "w"); char *str = calloc(81, sizeof(char)); if (fpr == NULL || fpw == NUL
NULL
,我找不到错误所在,因为如果它返回NULL
,则表示错误
FILE *fpr = fopen(path, "r");
FILE *fpw = fopen("code.txt", "w");
char *str = calloc(81, sizeof(char));
if (fpr == NULL || fpw == NULL) {
printf("yikes");
}
if (fgets(str, 80, fpr) != NULL) { //HERE ITS NULL
int p1 = 0;
int p2 = 0;
我真的想得很透彻,我不是很笨就是没有明显的问题。代码片段中有几个问题:
- 如果任何文件无法打开,您仍然调用
,如果fgets()
为fpr
,则该函数具有未定义的行为。对每个NULL
进行单独测试,打印更明确的错误消息并退出程序文件*
- 您应该将数组的大小传递给
,fgets()
,而不是81
80
- 数组应分配给至少82个字节:80个字符加上尾随的换行符和空字节终止符
- 您不测试内存分配失败。您甚至不应该分配内存,对于82字节这样的小尺寸,本地数组也可以
#包括
#包括
...
char-str[82];
文件*fpr=fopen(路径,“r”);
如果(fpr==NULL){
fprintf(stderr,“无法打开输入文件%s:%s\n”,路径,strerror(errno));
出口(1);
}
文件*fpw=fopen(“code.txt”,“w”);
如果(fpw==NULL){
fprintf(stderr,“无法打开输出文件%s:%s\n”、“code.txt”、strerror(errno));
出口(1);
}
if(fgets(str、str尺寸、fpr)){
int p1=0;
int p2=0;
...
始终测试错误条件并打印明确的错误消息,您将节省无数个小时的调试时间。
如果(fpr==NULL | | fpw==NULL){
您忽略此项,并尝试在可能的空fptr上使用fgets
。您应该让返回或退出。检查“path”是否包含路径和文件名。它是否打印“yikes”
?如果yikes
未打印,也可能意味着您的文件为空,或者存在错误条件(检查ferror()
以验证这一点)。您没有看到“yikes”,因为您没有换行符\n
。