2013-10-10 146 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]; 
}