top/contents search

12. 标准输入输出

12.1 这段代码有什么问题?

char c;
while((c = getchar()) != EOF) ...

12.1b 我有一个简单的程序,它读取字符直到遇到 EOF,但我如何才能实际从键盘上输入那个“EOF”值?我看到EOF<stdio.h>中定义为-1;我应该输入-1吗?

12.2 为什么简单的行复制循环while(!feof(infp)) { fgets(buf, MAXLINE, infp); fputs(buf, outfp); }会复制最后一行两次?

12.3 我正在使用fgets将文件中的行读取到指针数组中。为什么所有行最终都包含最后一行副本?

12.4 我的程序的提示和中间输出并不总是显示在屏幕上,尤其是在我通过另一个程序管道输出时。

12.5 如何一次读取一个字符,而不必等待 RETURN 键?

12.6 如何打印一个'%'格式字符串中打印一个printf,但不起作用。\%

12.7 为什么不

long int n = 123456;
printf("%d\n", n);
的函数调用是否会工作?

12.8 我认为 ANSI 函数原型应该可以防止参数类型不匹配。

12.9 有人告诉我使用%lfprintf是不对的。如何printf使用%f用于类型double,如果scanf需要%lf?

12.9b 什么printf这样的size_t使用什么格式化字符串,而我不知道它是long还是其他类型?

12.10 如何用实现可变字段宽度printf也就是说,不是像%8d那样,而是希望宽度在运行时指定。

12.11 如何打印带千位分隔符的数字?
货币格式的数字呢?

12.12 为什么调用scanf("%d", i)的函数调用是否会工作?

12.12b 为什么调用

char s[30];
scanf("%s", s);
在传递给&scanfscanf.

12.13 为什么这段代码不

double d;
scanf("%f", &d);
的函数调用是否会工作?

12.14 为什么代码不

short int s;
scanf("%d", &s);
的函数调用是否会工作?

12.15 如何在指定可变宽度scanf格式字符串?

12.16 如何读取具有特定格式的数据文件?
如何读取十个浮点数而不必使用一个费劲的scanf格式
字符串,例如"%f %f %f %f %f %f %f %f %f %f"?
如何将一行中任意数量的字段读取到数组中?

12.17 当我从键盘读取数字时scanf和 y"%d\n"格式,就像这样

	int n;
	scanf("%d\n", &n);
	printf("you typed %d\n", n);
它似乎会挂起,直到我输入额外的行。

12.18a 我正在读取一个数字scanf%d读取一个数字,然后使用gets():

	int n;
	char str[80];

	printf("enter a number: ");
	scanf("%d", &n);
	printf("enter a string: ");
	gets(str);
	printf("you typed %d and \"%s\"\n", n, str);
读取一个字符串,但编译器似乎跳过了对gets()!

12.18b 我正在使用scanf %c来读取Y/N的响应,但之后的输入被跳过了。

12.19 我想我可以用scanf通过检查其返回值来确保用户输入了我期望的数字值,从而使其更安全

	int n;

	while(1) {
		printf("enter a number: ");
		if(scanf("%d", &n) == 1)
			break;
		printf("try again: ");
	}

	printf("you typed %d\n", n);
但有时它似乎会进入无限循环。为什么?[脚注]

12.20 为什么大家都说不要用scanf?我应该用什么来替代?

12.21 我如何知道对于任意sprintf调用所需的缓冲区空间有多大?我如何避免目标缓冲区溢出?sprintf?

12.22 关于sprintf的返回值有什么说法?它返回的是一个intchar *?

12.23 为什么大家都说不要用gets()?

12.24 我本想检查errno在一长串printf调用之后,看看它们是否有失败的。

	errno = 0;
	printf("This\n");
	printf("is\n");
	printf("a\n");
	printf("test.\n");
	if(errno != 0)
		fprintf(stderr, "printf failed: %s\n", strerror(errno));
当我将输出重定向到文件时,为什么它会打印出像“printf failed: Not a typewriter”(printf 失败:不是打字机)这样的奇怪信息?

12.25 之间的区别是什么fgetpos/fsetposftell/fseek?
什么是fgetposfsetpos有什么好处?

12.26a 如何刷新待处理的输入,以便用户的预输入不会在下一个提示时被读取?会fflush(stdin)的函数调用是否会工作?

12.26b 如果fflush不起作用,我能用什么来刷新输入?

12.27 我写了这个例程,它应该打开一个文件

	myfopen(char *filename, FILE *fp)
	{
		fp = fopen(filename, "r");
	}
但是当我像这样调用它时
		FILE *infp;
		myfopen("filename.dat", infp);
infp变量在调用者中未能正确设置。

12.28 我甚至无法获得一个简单的fopen调用工作!这个调用有什么问题?

	FILE *fp = fopen(filename, 'r');

12.28b 如何打开像“file1'', ``file2'', ``file3'' 等文件,其中数字部分由变量控制?基本上我想要 ``file%d'',就像printf.

12.29 fopen在某些路径名下失败。

12.30 我试图在原地更新文件,使用fopenmode"r+"读取一个字符串,然后写回一个修改后的字符串,但它不起作用。

12.31 如何在文件中间插入或删除一行(或记录)?

12.32 如何在给定一个打开的流的情况下恢复文件名?

12.33 如何重定向stdinstdout到程序中的一个文件?

12.34 一旦我使用了freopen,我该如何找回原来的stdout(或stdin)?

12.35 我如何知道标准输入或输出是否被重定向(即“<'' 或 ``>”?

12.36 我正在尝试编写一个类似“more'' 的程序。如果stdin被重定向了,我该如何回到交互式键盘?

12.36b 如何安排输出同时去两个地方,例如到屏幕和文件?

12.37 我想在文件和内存之间以一次一个字节的方式读写数字,而不是像fprintffscanf那样作为格式化字符。我该怎么做?

12.38 如何正确读取二进制数据文件?我偶尔会看到0x0a0x0d值被损坏,如果数据包含值0x1a.

12.39 我正在为二进制文件编写一个“过滤器”,但是stdinstdout被预先打开为文本流。我该如何将它们的模式更改为二进制?

12.40 文本和二进制 I/O 之间有什么区别?

12.41 如何从数据文件中读/写结构?

12.42 如何编写代码来符合这些旧的二进制数据文件格式?

12.43 我正在将用户输入的字符串读入一个数组,然后稍后将它们打印出来。当用户输入一个像\n,为什么它没有被正确处理?


回到顶部

contents search
关于此 FAQ 列表   关于 Eskimo   搜索   反馈   版权

Eskimo North 托管