#include<stdio.h>
int main()
{
FILE *fp;
fp = fopen("test22.txt","r");
while(fgetc(fp)!=EOF)
printf("%c",*(fp->_ptr));
return 0;
}
我正在使用代码::块。我知道 '_ptr' 成员指向缓冲区中的下一个字符。该文件包含文本“Hello World!”。如何修改我的程序以仅使用 FILE 结构的成员来打印第一个字符?
#include<stdio.h>
int main()
{
FILE *fp;
fp = fopen("test22.txt","r");
while(fgetc(fp)!=EOF)
printf("%c",*(fp->_ptr));
return 0;
}
我正在使用代码::块。我知道 '_ptr' 成员指向缓冲区中的下一个字符。该文件包含文本“Hello World!”。如何修改我的程序以仅使用 FILE 结构的成员来打印第一个字符?
#include<stdio.h>
int main()
{
FILE *fp;
fp = fopen("test22.txt","r");
if(fp == NULL){
printf("File did not opened.\n");
return -1;
do{
printf("%c",*(fp->_ptr));
} while(fgetc(fp)!=EOF);
fclose(fp);
return 0;
}
使用该FILE
类型的成员是非常危险且不可移植的。虽然_ptr
可能指向流的当前缓存部分,但绝对不能保证 _ptr[0] 将始终指向文件中的第一个字符。请参阅此处说明:
FILE 对象的内容并不意味着可以从 和 标头的功能之外访问;事实上,可移植程序只能以指针的形式使用它们来识别流,因为对于某些实现,甚至指针本身的值对于识别流也很重要(即,指向 FILE 对象副本的指针可能与指向原始指针的解释不同)。
fgetc 将缓冲区推进到下一个字符。您可以在 fgetc 调用之前保存/打印第一个字母,使用 do-while,调用倒带等。
一种可能的解决方案是利用“在赋值时返回引用”,这意味着,在这样的操作之后,它会返回一个对其结果的引用,然后可以使用它来与 EOF 进行比较。
使用您的代码:
#include<stdio.h>
int main()
{
FILE *fp;
fp = fopen("text22.txt","r");
char buffer;
while((buffer=fgetc(fp))!=EOF)
printf("%c",buf);
return 0;
}