gpt4 book ai didi

C 程序打印最后一行两次(文件 I/O)

转载 作者:太空狗 更新时间:2023-10-29 16:11:53 24 4
gpt4 key购买 nike

最近我正在阅读 Deitel 编写的 C How to Program 第 7 版的文件处理部分。对于写入文件,它使用以下示例:

// Fig. 11.2: fig11_02.c
// Creating a sequential file
#include <stdio.h>

int main( void )
{
unsigned int account; // account number
char name[ 30 ]; // account name
double balance; // account balance

FILE *cfPtr; // cfPtr = clients.dat file pointer

// fopen opens file. Exit program if unable to create file
if ( ( cfPtr = fopen( "clients.dat", "w" ) ) == NULL ) {
puts( "File could not be opened" );
} // end if
else {
puts( "Enter the account, name, and balance." );
puts( "Enter EOF to end input." );
printf( "%s", "? " );
scanf( "%d%29s%lf", &account, name, &balance );

// write account, name and balance into file with fprintf
while ( !feof( stdin ) ) {
fprintf( cfPtr, "%d %s %.2f\n", account, name, balance );
printf( "%s", "? " );
scanf( "%d%29s%lf", &account, name, &balance );
} // end while

fclose( cfPtr ); // fclose closes file
} // end else
} // end main

如您所见,它首先在 else block 中扫描并打印数据,然后在 while 循环中扫描和打印数据。因为我认为做两次没有意义,所以它只是删除了 if-else 部分并编译了它。很好,它工作正常,但后来我意识到它复制了输出文件中的最后一行输入。在 Deitel 版本中它没有。

我的版本有什么问题??为什么它重复最后一行?我认为这可能是循环条件的问题,但我不确定..

编辑:此代码由 Dietel 使用,我不认为这是错误的,因为他使用 if-else 来修复由 !feof 引起的问题。但我想知道如果没有 if-else,我该如何解决它。

在没有 if-else 且只有循环的编辑版本中,输入和输出是:

输入:

1 test 25.6
2 some 95

输出:

1 test 25.6
2 some 95
2 some 95

最佳答案

关键是EOF测试必须始终跟在scanf()之后,并且在打印读取信息之前。

if-else 条件只是为了处理最终打开的错误条件,所以你是如何修改代码的并不完全清楚。但是人们经常尝试这样做:

  while ( !feof( stdin ) ) { 
scanf( "%d%29s%lf", &account, name, &balance );
fprintf( cfPtr, "%d %s %.2f\n", account, name, balance );
printf( "%s", "? " );
}

这是错误的,因为在读取最后一个数据时它不会“读取 EOF”(EOF 是您在完成读取数据后 遇到的条件):只有随后的 scanf () 会做,输出函数会打印错误的数据(之前的数据,因为输入错误没有被覆盖,所以最后一行重复了)。

例如这是正确的:

  for ( ;; ) { 
scanf( "%d%29s%lf", &account, name, &balance );
if (feof( stdin )) break;
fprintf( cfPtr, "%d %s %.2f\n", account, name, balance );
printf( "%s", "? " );
}

实际上我更喜欢它,而不是按照 Deitel 的建议重复相同的 scanf() 行两次。

关于C 程序打印最后一行两次(文件 I/O),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29143338/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com