c++ 将文本文件读入整数和字符串



我有一个文本文件的标准读取,但我需要的是一行的前 3 个字符作为 int 读取,将行的其余部分作为字符串逐行读取。我将下面的代码与示例文本放在一起。

#include <fstream>
#include <iostream>
using namespace std;
int main () 
{
 char buffer[256];
 ifstream myfile ("example.txt");
  while (! myfile.eof() )
  {
    myfile.getline (buffer,100);
    cout << buffer << endl;
  }
  return 0;
}

像这样的东西(伪代码,我相信你可以弄清楚真正的操作!

std::string line;
ifstream myfile ("example.txt");
// this gets a line of text from the file.
while(std::getline(myfile, line))
{
  // now you need to extract three characters and convert to int, so is it always guranteed?
  if (line.size() > 3)
  {
    std::string int_s = <substring from 0, size: 3>; // lookup this function in a reference!
    std::string rest_s = <substring from 3 to end>; // ditto for the lookup
    // now convert the integer part.
    long int int_v = <conversion routine, hint: strtol>; // lookup syntax in reference.
    // use...
  }
}

从stackoverflow检查这个和这个。

要么在缓冲区上使用 sscanf(假设字符串终止,则为 NULL),指定如下格式字符串:"%d%s" ,或者使用 operator<<来自std::stringstream.

注意:如果您的字符串包含空格,您应该在 sscanf 中使用"%d%n"而不是"%d%s",如下所示:

     int val = 0;
 int pos = 0;
 sscanf(buffer, "%d%n", &val, &pos);
 std::cout << "integer: " << val << std::endl;
 std::cout << "string: " << buffer+pos << std::endl;

哦,我实际上推荐Boost Spirit(气),稍后请参阅下面的示例

   #include <fstream>
    #include <iostream>
    #include <sstream>
    #include <string>
    using namespace std;
    int main () 
    {
        ifstream myfile ("example.txt");
        std::string line;
        while ( std::getline(myfile, line) )
        {
            std::istringstream iss(line.substr(0,3));
            int i;
            if (!(iss >> i))
            {
                i = -1;
                // TODO handle error
            }
            std::string tail = line.size()<4? "" : line.substr(4);
            std::cout << "int: " << i << ", tail: " << tail << std::endl;
        }
        return 0;
    }

只是为了好玩,这里有一个更灵活的基于 Boost 的解决方案:

#include <boost/spirit/include/qi.hpp>
#include <fstream>
#include <iostream>
using namespace std;
int main () 
{
    ifstream myfile ("example.txt");
    std::string line;
    while ( std::getline(myfile, line) )
    {
        using namespace boost::spirit::qi;
        std::string::iterator b(line.begin()), e(line.end());
        int i = -1; std::string tail;
        if (phrase_parse(b, e, int_ >> *char_, space, i, tail))
            std::cout << "int: " << i << ", tail: " << tail << std::endl;
        // else // TODO handle error
    }
    return 0;
}

如果你真的必须将前三个字符作为整数,我现在会坚持使用纯 STL 解决方案

使用 fscanf:

char str[256];
int  num = 0;
FILE *myFile = (FILE*) calloc(1, sizeof(FILE);
myFile = fopen("example.txt, "r");
while (fscanf(myFile, "%d %sn", &num, str))
{
  printf("%d, %sn", num str);
}
我相信

您假设行的最大长度为 100 个字符。 char szInt[4];
strncpy(szInt, buffer, 3);
szInt[3] = 0;
buffer += 3;
int errCode = atoi(szInt);

errCode 现在有你的 int,缓冲区有你的字符串。

相关内容

  • 没有找到相关文章

最新更新