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;
}
5 ответов
Примерно так (псевдокод, я уверен, что вы можете понять реальные операции!)
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...
}
}
Проверьте это и это из stackru.
Либо вы используете sscanf в своем буфере (предположим, что ваша строка, если NULL завершен), указав строку формата следующим образом: "%d%s"
или вы используете operator<<
от std::stringstream
,
NB. Если ваша строка содержит пробелы, вы должны использовать "% d% n" вместо "% d% s" с sscanf, как здесь:
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 (Qi), см. Ниже пример
#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
Я полагаю, вы предполагаете, что максимальная длина строки составляет 100 символов.
char szInt[4];
strncpy(szInt, buffer, 3);
szInt[3] = 0;
buffer += 3;
int errCode = atoi(szInt);
У errCode есть ваш int, а в буфере есть ваша строка.
Используйте fscanf:
char str[256];
int num = 0;
FILE *myFile = (FILE*) calloc(1, sizeof(FILE);
myFile = fopen("example.txt, "r");
while (fscanf(myFile, "%d %s\n", &num, str))
{
printf("%d, %s\n", num str);
}