博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
fgets vs scanf
阅读量:5886 次
发布时间:2019-06-19

本文共 2511 字,大约阅读时间需要 8 分钟。

fgets vs scanf - 德哥@Digoal - The Heart,The World.

fscanf 与scanf类似, 只是多了可选 数据流.
如stdin ,还是其他data stream.
[root@db-172-16-3-150 zzz]# cat n.c#include 
#include
char a[10];int main() { printf("enter a word:"); fgets(a,sizeof(a),stdin); // 使用stdin作为输入, fgets限定长度时使用sizeof(a) 不需要去除\0. scanf和fscanf使用%10s限定长度时表示存储10个字符(不包括\0, 所以要sizeof(a)-1) printf("a:%s\n", a); return 0;}结果[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./n.c -o n && ./nenter a word:abc def ghia:abc def g
[root@db-172-16-3-150 zzz]# cat n.c#include 
#include
#include
#include
int main() { char a[10]; char w_file[] = "/root/zzz/out.txt"; char w_mode[] = "w"; FILE *out = fopen(w_file,w_mode); printf("enter a word:"); fgets(a,sizeof(a),stdin); fprintf(out,"a:%s\n", a); // 输出到文件 return 0;}结果[root@db-172-16-3-150 zzz]# gcc -O3 -Wall -Wextra -Werror -g ./n.c -o n && ./nenter a word:abcdefghijkl[root@db-172-16-3-150 zzz]# cat out.txta:abcdefghi
在测试时遇到几个问题, 请教了诸位C高手后,记录一下.
请教一个问题。
#include 
#include
#include
#include
void output(FILE * out,char * a) { fprintf(out,"a:%s\n", a); close(fileno(out));}char a[10];char w_file[] = "/root/zzz/out.txt";char w_mode[] = "w";//FILE *out = fopen(w_file,w_mode);int main() { FILE *out = fopen(w_file,w_mode); printf("enter a word:"); fgets(a,sizeof(a),stdin); output(out,a); return 0;}
1. 这个怎么输出没有打到out.txt里面呢?
   但是 把close(fileno(out)) 注释就可以输出到out.txt
A:
两个问题, 1. 关闭文件前先调用flush到磁盘 2. 使用close关闭对应的是open打开的. fopen打开的应该使用fclose关闭.
man fclose : 
NOTES
       Note  that  fclose()  only flushes the user space buffers provided by the C library. To ensure that the data is
       physically stored on disk the kernel buffers must be flushed too, e.g. with sync(2) or fsync(2).

2. 如果把FILE *out = fopen(w_file,w_mode); 这个放在所有函数的外面就会报错
   ./n.c:14: error: initializer element is not constant
A:
C都是函数式语言,所有的可执行代码都必须在某个函数体内的,外部只能定义全局变量、常量等.
所以在全局变量初始化的地方都不能调用函数, 
最后代码修改为 : 
#include 
#include
#include
#include
#include
void output(FILE * lout,char * la) { fprintf(lout,"a:%s\n", la); if (fsync(fileno(lout))) { printf("error:%s\n", strerror(errno)); }}char a[10];char w_file[] = "/root/zzz/out.txt";char w_mode[] = "w";FILE *out;int main() { out = fopen(w_file,w_mode); printf("enter a word:"); fgets(a,sizeof(a),stdin); output(out,a); fclose(out); return 0;}

转载地址:http://rqmix.baihongyu.com/

你可能感兴趣的文章
在Linux命令行下发送html格式的邮件
查看>>
说说PHP中foreach引用的一个坑
查看>>
基于express框架的应用程序骨架生成器介绍
查看>>
Spring学习11-Spring使用proxool连接池 管理数据源
查看>>
2016第6周五
查看>>
ASP.NET 免费开源控件
查看>>
面向对象葵花宝典阅读思维导图(二)
查看>>
volatile关键字与线程间通信
查看>>
优秀大数据GitHub项目一览
查看>>
TCP/IP详解学习笔记(8)-DNS域名系统
查看>>
通过维基API实现维基百科查询功能
查看>>
bootstrap 2
查看>>
Annotation研究的一些学习资料
查看>>
webpack资料
查看>>
DotNet加密方式解析--散列加密
查看>>
OpenSSL使用2(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12概念说明)(转)
查看>>
【前端】:HTML
查看>>
SSM框架——使用MyBatis Generator自动创建代码
查看>>
java数据库操作:JDBC的操作
查看>>
35佳以字体为核心的优秀网页设计作品
查看>>