用freopen函数把stdin赋予文件后,gets函数从stdin中读不到东西
用freopen函数将stdin赋予了文件,用gets函数从stdin中读不到东西,但是用scanf读到了,就像gets函数啥也没干一样,这是为什么{:9_241:}
我的代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define LENGTH 81
int main(void) {
FILE *pOut = NULL;
FILE *pIn = NULL;
char *filename = (char*)"myfile.txt";
char mystr={};
char mystr_1 = {};
if(NULL == (pOut = freopen(filename, "w+", stdout)) ) {
fprintf(stderr, "\nError assigning stdout to %s. Program terminated.", filename);
exit(1);
}
fprintf(stderr, "This output goes to %s.\n", filename);
printf("\nThis sentence should be writed to %s", filename); //把这句话写入文件
fclose(pOut);
pOut = NULL;
if(NULL == (pIn = freopen(filename, "r+", stdin)) ) {
fprintf(stderr, "\nError assigning stdin to %s. Program terminated.", filename);
exit(1);
}
gets(mystr_1); //从文件中读取字符串
scanf("%s", mystr); //再尝试从文件中读取字符串
fprintf(stderr, "\n%s%s", mystr_1, mystr);
fclose(pIn);
pIn = NULL;
return 0;
}
屏幕上的输出如下:
This output goer to myfile.txt.
This 这个代码你想证实什么东西?不会仅仅是读写文本文件那么简单吧? 这个代码没有问题,只是你的例子举的不好,导致你认为有问题
我这边用不了gets函数,我想gets得到的是最前面的 '\n'
scanf 得到的是 This
你的这个代码没有问题
printf("\nThis sentence should be writed to %s", filename); //把这句话写入文件
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH 81
int main(void) {
FILE *pOut = NULL;
FILE *pIn = NULL;
//char *filename = (char *)"myfile.txt";
const char *filename = "myfile.txt";
char mystr = {};
char mystr_1 = {};
if(NULL == (pOut = freopen(filename, "w+", stdout))) {
fprintf(stderr, "\nError assigning stdout to %s. Program terminated.", filename);
exit(1);
}
fprintf(stderr, "This output goes to %s.\n", filename);
printf("\nThis sentence should be writed to %s", filename); //把这句话写入文件
fclose(pOut);
pOut = NULL;
if(NULL == (pIn = freopen(filename, "r+", stdin))) {
fprintf(stderr, "\nError assigning stdin to %s. Program terminated.", filename);
exit(1);
}
//gets(mystr_1); //从文件中读取字符串
scanf("%s", mystr); // 不是所有的系统都可以用gets函数,我这边就不能用
scanf("%s", mystr_1); //再尝试从文件中读取字符串
//fprintf(stderr, "\n%s%s", mystr_1, mystr);
fprintf(stderr, "%s\n", mystr);
fprintf(stderr, "%s\n", mystr_1);
fclose(pIn);
pIn = NULL;
return 0;
}
jackz007 发表于 2021-12-4 19:59
这个代码你想证实什么东西?不会仅仅是读写文本文件那么简单吧?
呃,我c语言正在学习文件,在熟悉使用文件的操作{:7_145:} $ ./main
This output goes to myfile.txt.
This
sentence #include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define LENGTH 81
int main(void) {
FILE *pOut = NULL;
FILE *pIn = NULL;
//char *filename = (char *)"myfile.txt";
const char *filename = "myfile.txt";
//cchar mystr = {};
//char mystr_1 = {};
if(NULL == (pOut = freopen(filename, "w+", stdout))) {
fprintf(stderr, "\nError assigning stdout to %s. Program terminated.", filename);
exit(1);
}
fprintf(stderr, "This output goes to %s.\n", filename);
printf("\nThis sentence should be writed to %s", filename); //把这句话写入文件
fclose(pOut);
pOut = NULL;
if(NULL == (pIn = freopen(filename, "r+", stdin))) {
fprintf(stderr, "\nError assigning stdin to %s. Program terminated.", filename);
exit(1);
}
//gets(mystr_1); //从文件中读取字符串
/*
scanf("%s", mystr); // 不是所有的系统都可以用gets函数,我这边就不能用
scanf("%s", mystr_1); //再尝试从文件中读取字符串
//fprintf(stderr, "\n%s%s", mystr_1, mystr);
fprintf(stderr, "%s\n", mystr);
fprintf(stderr, "%s\n", mystr_1);
*/
int ch;
while((ch = getchar()) != EOF) fputc(ch, stderr);
fputc('\n', stderr);
fclose(pIn);
pIn = NULL;
return 0;
}
$ ./main
This output goes to myfile.txt.
This sentence should be writed to myfile.txt chenlifeng 发表于 2021-12-4 20:09
呃,我c语言正在学习文件,在熟悉使用文件的操作
可是 freopen() 可不是一般的文件读写操作,而是输入输出流的改向,你确定知道自己在干什么? 人造人 发表于 2021-12-4 20:11
谢谢你{:5_106:} jackz007 发表于 2021-12-4 20:13
可是 freopen() 可不是一般的文件读写操作,而是输入输出流的改向,你确定知道自己在干什么?
我知道它可以把标准流指针和文件关联起来,只是我刚看到这个函数这里,想尝试一下它的功能 chenlifeng 发表于 2021-12-4 20:20
我知道它可以把标准流指针和文件关联起来,只是我刚看到这个函数这里,想尝试一下它的功能
Ok!
页:
[1]