-1

我已经看到之前有人问过这个问题,但似乎没有一个答案适用于我的问题。

我正在尝试编写一个函数来读取文件的内容并打印它们。这是我的代码;

int main()
{
    int c;
    fseek(stdin, 0, SEEK_SET);
    c = getc(stdin);

    while ((c = getchar()) != EOF)
    {
        putchar(c);
        fseek(stdin, 1, SEEK_CUR);
        c = getc(stdin);
    }
}

运行代码时,我使用管道输入文件;

./[Program] < [File.txt]

例如。

./FileRead < Hello.txt

但是,当我运行它时,我会收到一堆乱七八糟的随机字母。这是一个例子:

我正在输入的文件的内容:

你好世界!

这是一个测试文件。

我希望这行得通!

这是输出:

很好

铁丝网

谁能帮我找出问题所在?

4

1 回答 1

1

需要注意的是 getc() 函数在读取一个字符后自动将活动文件指针移动到下一个位置,所以

//fseek(stdin, 0, SEEK_SET);  

打开文件并将指针设置在第一个字符

//c = getc(stdin);           

//getc() 获取 'H' 行中的下一个字符,并将指针向前移动一个字符 c == 'H'

 while ((c = getchar()) != EOF)

//getchar() 

从文件中读取时,接缝正在工作(不推荐)尝试使用

//getc(<filepointer>)

c now == 'e' 并且文件指针被移动到第一个'l'。

然后你有

//putchar(c) 

打印'e'字符

 //fseek(stdin, 1, SEEK_CUR);    

将 *fp 向前移动一个字符到第二个 'l'

然后你有 // c = getc(stdin);
读取行中的下一个字符,即第二个 'l',将 *fp 移动到 ' ' 空间,然后重复。

基本上将代码更改为:

 while ((ch = getch(stdin)) != EOF)
{
 putchar(c);

}

代码应该可以正常工作。

注意:对于以文本模式打开的流,fseek 和 _fseeki64 的使用有限,因为回车换行翻译会导致 fseek 和 _fseeki64 产生意外结果。唯一能保证在文本模式下打开的流上工作的 fseek 和 _fseeki64 操作是:

• 相对于任何原点值的偏移量为 0。

• 使用 fseek 或 _ftelli64 时使用 fseeki64 时,使用从调用 ftell 返回的偏移值从文件开头查找。

于 2014-10-29T00:49:06.663 回答