Ввод построчно из входного файла и токенизация с использованием strtok () и вывод в выходной файл - PullRequest
13 голосов
/ 01 декабря 2010

То, что я пытаюсь сделать, - это ввести файл LINE BY LINE, токенизировать и вывести его в выходной файл. Что я смог сделать, так это ввести первую строку в файле, но моя проблема в том, что я не могу введите следующую строку для токенизации, чтобы ее можно было сохранить как вторую строку в выходном файле, это то, что я мог сделать до сих пор для ввода первой строки в файле.

#include <iostream>
#include<string>    //string library
#include<fstream>    //I/O stream input and output library

using namespace std;
const int MAX=300;    //intialization a constant called MAX for line length 
int main()
{
   ifstream in;     //delcraing instream
   ofstream out;    //declaring outstream

   char oneline[MAX];   //declaring character called oneline with a length MAX

   in.open("infile.txt");  //open instream
   out.open("outfile.txt");  //opens outstream
   while(in)
   {

    in.getline(oneline,MAX); //get first line in instream

    char *ptr;      //Declaring a character pointer
    ptr = strtok(oneline," ,");
    //pointer scans first token in line and removes any delimiters


  while(ptr!=NULL)
   {

    out<<ptr<<" ";    //outputs file into copy file
    ptr=strtok(NULL," ,");
    //pointer moves to second token after first scan is over 
   }

   }
   in.close();      //closes in file
   out.close();      //closes out file


   return 0;
}

Ответы [ 2 ]

15 голосов
/ 13 января 2011

Библиотека C ++ String Toolkit (StrTk) имеет следующее решение вашей проблемы:

#include <iostream>
#include <string>
#include <deque>
#include "strtk.hpp"

int main()
{
   std::deque<std::string> word_list;
   strtk::for_each_line("data.txt",
                        [&word_list](const std::string& line)
                        {
                           const std::string delimiters = "\t\r\n ,,.;:'\""
                                                          "!@#$%^&*_-=+`~/\\"
                                                          "()[]{}<>";
                           strtk::parse(line,delimiters,word_list);
                        });

   std::cout << strtk::join(" ",word_list) << std::endl;

   return 0;
}

Дополнительные примеры можно найти Здесь

1 голос
/ 01 декабря 2010

Вы используете библиотеку времени выполнения C, когда C ++ делает это аккуратнее.

Код для этого в C ++:

ifstream in;     //delcraing instream
ofstream out;    //declaring outstream

string oneline;

in.open("infile.txt");  //open instream
out.open("outfile.txt");  //opens outstream
while(getline(in, oneline))
{
    size_t begin(0); 
    size_t end;
    do
    {
        end = oneline.find_first_of(" ,", begin);

        //outputs file into copy file
        out << oneline.substr(begin, 
                    (end == string::npos ? oneline.size() : end) - begin) << ' ';

        begin = end+1;
        //pointer moves to second token after first scan is over 
    }
    while (end != string::npos);
}

in.close();      //closes in file
out.close();      //closes out file

Введите:

а, б с

de fg, hijklmn

Выход:

a b c de fg hijklmn

Если вам нужны переводы строки, добавьте out << endl; в соответствующую точку.

...