在file.txt中,我有以下内容:
We are
in 2012
我想打印第二个字符,即“e”,但以下程序显示为空白。
#include <stdio.h>
#include <stdlib.h>
int main()
{
char c;
FILE *file;
file = fopen("file.txt", "r");
c = getc(file+1);
putchar(c);
fclose(file);
return 0;
}
如何正确打印第二个字符? (当我在getc中传递文件时,它会打印w。)
答案 0 :(得分:3)
文件不是指向内存缓冲区的指针。
FILE* file;
它是指向文件结构的指针。通过向getc()提供(file + 1)参数,您只需为其提供一个未初始化的区域作为输入。
答案很简单:要么两次调用getc(); 或者,因为它可能是一个练习,你可以使用fseek()将文件指针移动到正确的位置。它变成了:
fseek(file, 1, SEEK_SET);
c = getc(file);
putchar(c);
答案 1 :(得分:1)
不要在FILE指针上使用数学运算。
c = getc(file);
c = getc(file);
putchar(c);
答案 2 :(得分:1)
FILE *
返回的fopen
对象不是流指针,它是文件处理函数使用的抽象数据结构。要使流指针前进,请使用fseek。
file + 1
指向FILE
对象之后的第一个内存地址,并将其用于除比较指针之外的任何内容都是未定义的行为。因此,c = getc(file + 1);
是未定义的行为,可能会使您的程序崩溃,或者根本不执行任何操作。
答案 3 :(得分:0)
您需要多次致电getc
:
c = getc(file); // Get first character
c = getc(file); // Get second character
putchar(c);
答案 4 :(得分:0)
当你这样做时:
c = getc(file+1);
它尝试将指针file
递增1,使其指向内存中跟随的FILE*
(即进一步到地址sizeof(FILE)
),然后将此无效指针传递给getc
导致未定义的行为。
您可以使用fgets
提取整行并直接访问某些特定字符:
char line[100];
if (fgets(line, 100, file)) {
c = line[1];
}