使用 fgets 时未打印出来
Not being printed out when using fgets
我正在学习 C 中的文件 input/output。但有些地方我不明白。
我正要使用 fgets 在 [words.txt] 中打印简单的句子 ,但它不起作用。
[words.txt]如下:
This speech caused a remarkable sensation among the party.
我的代码是:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *buffer = malloc(100);
memset(buffer, 0, 100);
FILE *fp = fopen("words.txt", "r");
fgets(buffer, sizeof(buffer), fp);
printf("%s\n", buffer);
fclose(fp);
free(buffer);
return 0;
}
输出为“This sp”
我以为我的代码没有问题,结果输出结果出人意料。
我的意思是,
为什么没有打印出整个字符串?
另外,这个输出字符串是什么原因?
(似乎没有迹象表明这段代码会有7个字符,即“This sp”)
您的缓冲区声明为 char*
而不是固定大小的数组,因此 sizeof(buffer)
为 8,因此读取和打印 7 个字符(加上 '[=14=]'
)。 sizeof
不知道你向 malloc
请求了多少字节。当你开始学习指针并意识到数组像指针一样工作但又不完全是时,我认为这是最令人困惑的事情。
解决方案:
fgets(buffer, 100, fp);
或
char buffer[100];
fgets(buffer, sizeof(buffer) fp);
由于您将 buffer
声明为 char *buffer
,因此它不是数组。相反,它只是一个指针。
表达式sizeof buffer
将计算指针本身的大小,而不是指针指向的对象的大小。由于指针的大小通常为 32 位或 64 位,因此表达式 sizeof buffer
的计算结果为 4
或 8
。在你的情况下,它似乎是 8
.
如果你声明了 buffer
而不是像这样
char buffer[100];
那么 buffer
将不是一个指针,而是一个数组,表达式 sizeof buffer
的计算结果将是 100
.
在您的情况下,使用 malloc
而不是数组没有任何问题。但是,如果使用malloc
,则必须自己记住分配内存的大小。您不能为此使用 sizeof
运算符。
您可以为此使用预处理器宏,而不是在代码的多个位置写入数字 100
:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ALLOCATION_SIZE 100
int main()
{
char *buffer = malloc( ALLOCATION_SIZE );
memset(buffer, 0, ALLOCATION_SIZE );
FILE *fp = fopen("words.txt", "r");
fgets(buffer, ALLOCATION_SIZE, fp);
printf("%s\n", buffer);
fclose(fp);
free(buffer);
return 0;
}
这样做的好处是,如果您决定将数字 100
更改为其他数字,您只需在代码中的一个地方更改该数字,而不是几个地方。
我正在学习 C 中的文件 input/output。但有些地方我不明白。
我正要使用 fgets 在 [words.txt] 中打印简单的句子 ,但它不起作用。
[words.txt]如下:
This speech caused a remarkable sensation among the party.
我的代码是:
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
char *buffer = malloc(100);
memset(buffer, 0, 100);
FILE *fp = fopen("words.txt", "r");
fgets(buffer, sizeof(buffer), fp);
printf("%s\n", buffer);
fclose(fp);
free(buffer);
return 0;
}
输出为“This sp”
我以为我的代码没有问题,结果输出结果出人意料。
我的意思是,
为什么没有打印出整个字符串?
另外,这个输出字符串是什么原因?
(似乎没有迹象表明这段代码会有7个字符,即“This sp”)
您的缓冲区声明为 char*
而不是固定大小的数组,因此 sizeof(buffer)
为 8,因此读取和打印 7 个字符(加上 '[=14=]'
)。 sizeof
不知道你向 malloc
请求了多少字节。当你开始学习指针并意识到数组像指针一样工作但又不完全是时,我认为这是最令人困惑的事情。
解决方案:
fgets(buffer, 100, fp);
或
char buffer[100];
fgets(buffer, sizeof(buffer) fp);
由于您将 buffer
声明为 char *buffer
,因此它不是数组。相反,它只是一个指针。
表达式sizeof buffer
将计算指针本身的大小,而不是指针指向的对象的大小。由于指针的大小通常为 32 位或 64 位,因此表达式 sizeof buffer
的计算结果为 4
或 8
。在你的情况下,它似乎是 8
.
如果你声明了 buffer
而不是像这样
char buffer[100];
那么 buffer
将不是一个指针,而是一个数组,表达式 sizeof buffer
的计算结果将是 100
.
在您的情况下,使用 malloc
而不是数组没有任何问题。但是,如果使用malloc
,则必须自己记住分配内存的大小。您不能为此使用 sizeof
运算符。
您可以为此使用预处理器宏,而不是在代码的多个位置写入数字 100
:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define ALLOCATION_SIZE 100
int main()
{
char *buffer = malloc( ALLOCATION_SIZE );
memset(buffer, 0, ALLOCATION_SIZE );
FILE *fp = fopen("words.txt", "r");
fgets(buffer, ALLOCATION_SIZE, fp);
printf("%s\n", buffer);
fclose(fp);
free(buffer);
return 0;
}
这样做的好处是,如果您决定将数字 100
更改为其他数字,您只需在代码中的一个地方更改该数字,而不是几个地方。