2013-10-10 101 views
0

在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。)

+1

我不认为递增文件指针将产生想要的结果。我不认为这是文件内容指针。 –

+0

想想验证答案,如果其中一个回答你的问题。 – Hughenot

回答

3

文件不是指向内存缓冲区的指针。

FILE* file; 

它是指向文件结构的指针。通过为getc()提供(file + 1)参数,您只需提供一个未初始化的区域作为输入。

答案很简单:或者调用getc()两次; 或者,因为它可能是一个练习,您可以使用fseek()将文件指针移动到正确的位置。它变成:

fseek(file, 1, SEEK_SET); 
    c = getc(file); 
    putchar(c); 
+0

就是这样,fseek。 –

1

不要在FILE指针上使用数学运算。

c = getc(file); 
c = getc(file); 
putchar(c); 
0

你需要调用getc几次:

c = getc(file); // Get first character 
c = getc(file); // Get second character 

putchar(c); 
1

FILE *对象fopen的回报是不是流指针,它是文件处理功能使用抽象的数据结构。要推进流指针使用fseek

file + 1改为指向FILE对象之后的第一个内存地址,并将它用于比较指针之外的任何其他内容都是未定义的行为。所以c = getc(file + 1);是未定义的行为,可以很好地崩溃你的程序,或者什么也不做。

0

当你这样做:

c = getc(file+1); 

它试图通过1递增指针file,使之指向内存后面(即地址sizeof(FILE)进一步)的FILE*,然后通过这个无效指针getc导致未定义的行为

你可以使用fgets直接提取整条生产线,并访问一些特定的字符:

char line[100]; 
if (fgets(line, 100, file)) { 
    c = line[1]; 
}