C++获取文件输入的几种方法cin getline stringstream

cin

标准输入流cin 与流提取运算符 >> 结合使用,如下所示:

#include 
using namespace std;
int main( )
{
   char name[50]; 
   cout << "请输入您的名称: ";
   cin >> name;
   cout << "您的名称是: " << name << endl; 
}

scanf

C库函数scanf(const char *format, …) 从标准输入 stdin 读取格式化输入。
函数声明为int scanf(const char *format, ...)
format 说明符形式为:[=%[*][width][modifiers]type=]
type为一个字符,指定了要被读取的数据类型以及数据读取方式。常见的有。
scanf 类型说明符:

类型 合格的输入 参数的类型
%c 单个字符:读取下一个字符。如果指定了一个不为 1 的宽度 width,函数会读取 width 个字符,并通过参数传递,把它们存储在数组中连续位置。在末尾不会追加空字符。 char *
%d 十进制整数:数字前面的 + 或 - 号是可选的。 int *
%e、%E、%f、%F、%g、%G 浮点数:包含了一个小数点、一个可选的前置符号 + 或 -、一个可选的后置字符 e 或 E,以及一个十进制数字。 float *
%i 读入十进制,八进制,十六进制整数 。 int *
%o 八进制整数。 int *
%s 字符串。这将读取连续字符,直到遇到一个空格字符(空格字符可以是空白、换行和制表符)。 char *
%p 读入一个指针 。

如果成功,该函数返回成功匹配和赋值的个数。如果到达文件末尾或发生读错误,则返回 EOF。

#include
int main(void) 
{ 
   int a,b,c;  
   printf("请输入三个数字:");
   scanf("%d%d%d",&a,&b,&c); 
   printf("%d,%d,%d\n",a,b,c);
   return 0; 
}

请输入三个数字:1 2 3
1, 2, 3

&a&b&c 中的&是地址运算符,分别获得这三个变量的内存地址。
%d%d%d是按十进值格式输入三个数值。输入时,在两个数据之间可以用一个或多个空格、tab 键、回车键分隔。
如果使用,来分隔输入的 %d, 相应的输入时也需要添加,:

#include
int main(void)
{
    int a,b,c;
 
    printf("请输入三个数字:");
    scanf("%d, %d, %d",&a,&b,&c);
    printf("%d, %d, %d\n",a,b,c);
    return 0;
}

请输入三个数字:1, 2, 3
1, 2, 3


sprintf

sprintf函数原型为int sprintf(char *str, const char *format, ...)。作用是格式化字符串
format 说明符形式为:[=%[*][width][modifiers]type=]
type为一个字符,指定了要被读取的数据类型以及数据读取方式。同上。
具体功能如下所示:
(1)将数字变量转换为字符串。
(2)得到整型变量的16进制和8进制字符串。
(3)连接多个字符串。

#include
int main(){
    char str[256] = { 0 };
    int data = 1024;
    //将data转换为字符串
    sprintf(str,"%d",data);
    //获取data的十六进制
    sprintf(str,"0x%X",data);
    //获取data的八进制
    sprintf(str,"0%o",data);
    const char *s1 = "Hello";
    const char *s2 = "World";
    //连接字符串s1和s2
    sprintf(str,"%s %s",s1,s2);
    cout<<str<<endl; 
    return 0;


getline

getline:定义在namespace的全局函数,声明放在了文件中。
getline利用cin可以从标准输入设备键盘读取一行,当遇到如下三种情况会结束读操作:
  (1)文件结束;
  (2)行分割符的出现;
  (3)输入达到最大限度。
函数原型有两种:
getline ( istream& is, string& str);【默认以换行符\n分隔行】
getline ( istream& is, string& str, char delim)。

#include 
#include 
using namespace std;
int main( )
{
   string name; 
   cout << "请输入您的名称: ";
   getline(cin,name);
   cout << "您的名称是: " << name << endl; 
}

stringstream

库定义了三种类:istringstreamostringstreamstringstream,分别用来进行流的输入、输出和输入输出操作。
可以通过stringstream实现任意类型的转换,模板如下。

template
out_type convert(const in_value & t){
  stringstream stream;
  stream<>result;//向result中写入值
  return result;
}

下面的代码是将字符串s传递给流,再从流中将值传递给字符串t。

int main(){
    string s = "1 23 # 4";
    stringstream ss;
    ss<<s;
    string t;
    while(ss>>t){
        cout<<t<<" ";
        int val = convert<int>(t);
        cout<<val<<endl;
    }
    return 0;
}

输出为

1 1
23 23
# 0
4 4

实例:写split分割字符串函数

C++ split分割字符串函数
将字符串绑定到输入流istringstream,然后使用getline的第三个参数,自定义使用什么符号进行分割就可以了。

#include 
#include 
#include 
#include 
using namespace std;
void split(const string& s,vector<int>& sv,const char flag = ' ') {
    sv.clear();
    istringstream iss(s);
    string temp;

    while (getline(iss, temp, flag)) {
        sv.push_back(stoi(temp));
    }
    return;
}

int main() {
    string s("123:456:7");
    vector<int> sv;
    split(s, sv, ':');
    for (const auto& s : sv) {
        cout << s << endl;
    }
    system("pause");
    return 0;
}

你可能感兴趣的:(笔试编程题)