كيف يمكنني تغيير هذه العملية tokenization للعمل على ملف نصي مع خطوط متعددة؟

StackOverflow https://stackoverflow.com/questions/485371

  •  20-08-2019
  •  | 
  •  

سؤال

وأنا أعمل هذا الكود:

#include <string>
#include <vector>
#include <iostream>
#include <istream>
#include <ostream>
#include <iterator>
#include <sstream>
#include <algorithm>

int main()
{
  std::string str = "The quick brown fox";

  // construct a stream from the string
  std::stringstream strstr(str);

  // use stream iterators to copy the stream to the vector as whitespace separated strings
  std::istream_iterator<std::string> it(strstr);
  std::istream_iterator<std::string> end;
  std::vector<std::string> results(it, end);

  // send the vector to stdout.
  std::ostream_iterator<std::string> oit(std::cout);
  std::copy(results.begin(), results.end(), oit);
}

ل، بدلا من tokenizing خط واحد ووضعه في النتائج ناقلات، فإنه tokenizes مجموعة من خطوط مأخوذة من هذا الملف النصي ويضع الكلمات مما أدى إلى ناقل واحد.

Text File:
Munroe states there is no particular meaning to the name and it is simply a four-letter word without a phonetic pronunciation, something he describes as "a treasured and carefully-guarded point in the space of four-character strings." The subjects of the comics themselves vary. Some are statements on life and love (some love strips are simply art with poetry), and some are mathematical or scientific in-jokes.

وحتى الآن، وأنا الوحيد الواضح أنني بحاجة إلى استخدام

while (getline(streamOfText, readTextLine)){} 

للحصول على حلقة على التوالي.

ولكن لا أعتقد أن هذا من شأنه العمل:

وحين (getline (streamOfText، readTextLine)) {                محكمة << << readTextLine ENDL؛

و// بناء تيار من السلسلة   الأمراض المنقولة جنسيا :: stringstream strstr (readTextLine)؛

والمكررات // استخدام تيار لنسخ تيار لمكافحة ناقلات كسلاسل بيضاء فصل   الأمراض المنقولة جنسيا :: istream_iterator عليه (strstr)؛   نهاية الأمراض المنقولة جنسيا :: istream_iterator.   نتائج الأمراض المنقولة جنسيا :: ناقلات (عليه، نهاية)؛

/*HOw CAN I MAKE THIS INSIDE THE LOOP WITHOUT RE-DECLARING AND USING THE CONSTRUCTORS FOR THE ITERATORS AND VECTOR? */

  // send the vector to stdout.
  std::ostream_iterator<std::string> oit(std::cout);
  std::copy(results.begin(), results.end(), oit);

          }
هل كانت مفيدة؟

المحلول

نعم، ثم لديك خط كامل واحدة في readTextLine. غير أن ما تريد في تلك الحلقة؟ ثم بدلا من بناء ناقلات من المكررات istream، نسخ في ناقلات، وتحديد ناقلات خارج الحلقة:

std::vector<std::string> results;
while (getline(streamOfText, readTextLine)){
    std::istringstream strstr(readTextLine);
    std::istream_iterator<std::string> it(strstr), end;
    std::copy(it, end, std::back_inserter(results));
}

وكنت في الواقع لا تحتاج إلى قراءة سطر في السلسلة الأولى، إذا كان كل ما تحتاجه هو كل الكلمات من تيار، وأية معالجة في كل سطر. قرأت للتو من تيار الآخر مباشرة كما فعلت في التعليمات البرمجية. انها لن تقرأ فقط الكلمات من سطر واحد، ولكن من تيار بأكمله، حتى ملف نهاية:

std::istream_iterator<std::string> it(streamOfText), end;
std::vector<std::string> results(it, end);

لتفعل كل ذلك يدويا، مثل أن تسأل عن في التعليقات، هل

std::istream_iterator<std::string> it(streamOfText), end;
while(it != end) results.push_back(*it++);

وأنصحك بقراءة كتاب جيد في هذا الشأن. وسوف تظهر لك تقنيات أكثر فائدة بكثير على ما أعتقد. C ++ مكتبة القياسية التي كتبها Josuttis هو كتاب جيد.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top