0
#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 结构的成员来打印第一个字符?

4

4 回答 4

1
#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;
}
于 2013-07-02T05:47:53.610 回答
1

使用该FILE类型的成员是非常危险且不可移植的。虽然_ptr可能指向流的当前缓存部分,但绝对不能保证 _ptr[0] 将始终指向文件中的第一个字符。请参阅此处说明:

FILE 对象的内容并不意味着可以从 和 标头的功能之外访问;事实上,可移植程序只能以指针的形式使用它们来识别流,因为对于某些实现,甚至指针本身的值对于识别流也很重要(即,指向 FILE 对象副本的指针可能与指向原始指针的解释不同)。

于 2013-07-02T06:52:46.547 回答
0

fgetc 将缓冲区推进到下一个字符。您可以在 fgetc 调用之前保存/打印第一个字母,使用 do-while,调用倒带等。

于 2013-07-02T05:47:11.037 回答
0

一种可能的解决方案是利用“在赋值时返回引用”,这意味着,在这样的操作之后,它会返回一个对其结果的引用,然后可以使用它来与 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;
}
于 2013-07-02T08:05:04.477 回答