2013-10-10 2 views
0

В file.txt У меня есть следующее содержание:Печать символа из файла после того, как увеличивающиеся указатель файла

We are 
in 2012 

Я хочу, чтобы напечатать второй символ т.е. «е», но следующая программа показывает пустой ,

#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

Я не думаю, что увеличивающимся указатель файла приведет к получению желаемого результата. Я не думаю, что это указатель файла CONTENT. –

+0

Подумайте об утверждении ответа, если один из них ответит на ваш вопрос. – Hughenot

ответ

3

файл не является указателем на буфер памяти.

Это указатель на файловую структуру. Предоставляя (file + 1) аргумент getc(), вы просто предоставили ему неинициализированную область в качестве входных данных.

Ответ довольно прост: либо вызов 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); 

пытается увеличивают указатель file на 1, что делает его указует на FILE*, который следует в памяти (то есть по адресу sizeof(FILE) далее), а затем передает этот недопустимый указатель getc в результате не определено поведение.

Вы можете использовать fgets извлечь всю строку и получить доступ к некоторому специфическому характеру непосредственно:

char line[100]; 
if (fgets(line, 100, file)) { 
    c = line[1]; 
} 
Смежные вопросы