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

4

5 回答 5

4

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

  FILE* file;

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

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

  fseek(file, 1, SEEK_SET);
  c = getc(file);
  putchar(c);
于 2013-10-10T13:34:01.343 回答
1

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

 c = getc(file); 
 c = getc(file); 
 putchar(c);
于 2013-10-10T13:35:28.383 回答
1

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

file + 1而是指向FILE对象之后的第一个内存地址,并将其用于除比较指针之外的任何事情是未定义的行为。未定义的行为也是如此c = getc(file + 1);,很可能会使您的程序崩溃,或者什么也不做。

于 2013-10-10T13:36:33.937 回答
0

您需要getc多次调用:

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

 putchar(c);
于 2013-10-10T13:35:34.973 回答
0

当你这样做时:

c = getc(file+1); 

它尝试将指针file加 1,使其指向FILE*内存中跟随的那个(即sizeof(FILE)进一步指向地址),然后将这个无效指针传递给getc导致未定义的行为

您可以使用fgets提取整行并直接访问某些特定字符:

char line[100];
if (fgets(line, 100, file)) {
    c = line[1];
}
于 2013-10-10T13:40:40.030 回答