【问题标题】:Taking string objects using getline使用 getline 获取字符串对象
【发布时间】:2012-10-06 12:57:16
【问题描述】:

我正在尝试使用 getline 将用户输入直接从控制台获取到 C++ 字符串对象中。但是我没有这样做,因为编译器给了我以下错误。

main.cpp: In function ‘int main(int, char**)’:
main.cpp:52:28: error: no matching function for call to ‘std::basic_ifstream<char>::getline(std::ifstream&, std::string&)’
main.cpp:52:28: note: candidates are:
/usr/include/c++/4.6/istream:599:5: note: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::getline(std::basic_istream<_CharT, _Traits>::char_type*, std::streamsize, std::basic_istream<_CharT, _Traits>::char_type) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::char_type = char, std::streamsize = int]
/usr/include/c++/4.6/istream:599:5: note:   candidate expects 3 arguments, 2 provided
/usr/include/c++/4.6/istream:408:7: note: std::basic_istream<_CharT, _Traits>::__istream_type& std::basic_istream<_CharT, _Traits>::getline(std::basic_istream<_CharT, _Traits>::char_type*, std::streamsize) [with _CharT = char, _Traits = std::char_traits<char>, std::basic_istream<_CharT, _Traits>::__istream_type = std::basic_istream<char>, std::basic_istream<_CharT, _Traits>::char_type = char, std::streamsize = int]
/usr/include/c++/4.6/istream:408:7: note:   no known conversion for argument 2 from ‘std::string {aka std::basic_string<char>}’ to ‘int’

这里是源代码:

#include <iostream>
 #include <fstream>
 #include <cmath>
 #include <cstdlib>
 #include <cstring>
 #include <string>
 #include <map>
 #include <set>
 #include <algorithm>
 #include <cstdio>

 #define MAX_LIN 1024

 using namespace std;

 typedef set<int> si;
int main(int argc, char** argv)
 {   
     string line1;
     string line2;

     map <string , si > iMap;

     if (argc != 3) { 
         fprintf(stderr,"Usage: a.out <file1> <file2>\n");
     }

     ifstream f1,f2;

     f1.open(argv[1],ifstream::in);
     f2.open(argv[2],ifstream::in);

     while(!f1.eof()) {
         getline(f1,line1);
         mParse(line1);
     }   

     while(!f2.eof()) {
         f2.getline(f2,line2);
         mParse(line2);
     }   

     f1.close();
     f2.close();


     return 0;
 }   

【问题讨论】:

  • #include &lt;string&gt;了吗?请将您的包含指令添加到发布的代码中,我没有看到任何内容。
  • 你在标题中完成#include&lt;fstream&gt;了吗?
  • 是的,我都做过。让我包括整个标题。
  • @humanitarian0098:学习阅读编译器消息是个好主意。它们并不总是最漂亮的,但毕竟我们必须每天与它们打交道。 std::basic_ifstream&lt;char&gt;::getline(std::ifstream&amp;, std::string&amp;) 也可以看作std::ifstream::getline(std::ifstream&amp;, std::string&amp;),这是编译器猜测你试图调用的内容。请注意它是如何表明这两种情况的:1/ 它是您正在调用的 std::ifstream 方法,以及 2/ 您将 std::ifstream&amp;std::string&amp; 作为参数传递。

标签: c++ string getline


【解决方案1】:

这就是原因:

f2.getline(f2,line2);

应该是:

getline(f2,line2);

有一个std::ifstream::getline(),但它接受不同的参数。

注意while 循环的结构不正确,因为应该在读取操作后立即检查eof()。编码循环的常用方法是:

while (getline(f2, line2))
{
    mParse(line2);
}

【讨论】:

    【解决方案2】:

    这是规范的方式:

     std::ifstream f1(argv[1]);
     std::ifstream f2(argv[2]);
    
     for (std::string line; std::getline(f1, line); )
     {
         mparse(line);
     }
    
     for (std::string line; std::getline(f2, line); )
     {
         mparse(line);
     }
    

    注意我们写的所有内容,每一个都应该被视为大罪:eofopencloseifstream::inreturn 0

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-01-05
      • 2021-11-05
      • 2020-02-16
      • 2013-08-21
      • 2016-07-10
      • 2012-05-21
      • 2012-01-29
      • 1970-01-01
      相关资源
      最近更新 更多