এলডিএফ, সিআর, এবং সিআরএলএফ পরিচালনা করতে স্ট্র্যাড :: আইফ্রিম?


85

বিশেষত আমি আগ্রহী istream& getline ( istream& is, string& str );। ইফস্ট্রিম কনস্ট্রাক্টরের কাছে কী কোনও বিকল্প আছে যে এটি সমস্ত নিউলাইন এনকোডিংগুলিকে হুডের নীচে '\ n' এ রূপান্তর করতে বলবে? আমি কল করতে সক্ষম হতে চাই getlineএবং এটি ক্রেতার সাথে সমস্ত লাইন শেষগুলি পরিচালনা করতে চাই ।

আপডেট : স্পষ্ট করার জন্য, আমি কোডটি লিখতে সক্ষম হতে চাই যা প্রায় যে কোনও জায়গায় সংকলিত হয় এবং যে কোনও জায়গা থেকে ইনপুট নেবে। '\ N' ছাড়াই '\ r' থাকা বিরল ফাইলগুলি সহ। সফ্টওয়্যার ব্যবহারকারীর জন্য অসুবিধা হ্রাস করা।

সমস্যাটি সমাধান করা সহজ, তবে আমি এখনও স্ট্যান্ডার্ডভাবে সঠিকভাবে সমস্ত টেক্সট ফাইল ফর্ম্যাটগুলি পরিচালনা করতে আগ্রহী।

getlineএকটি '\ n' অবধি স্ট্রিংয়ে পুরো লাইনে পড়ে। '\ N' স্ট্রিম থেকে গ্রাস করা হয়েছে, তবে getline এটিকে স্ট্রিংয়ে অন্তর্ভুক্ত করে না। এটি এখন পর্যন্ত ঠিক আছে, তবে স্ট্রিংটিতে অন্তর্ভুক্ত হওয়ার আগে '\ n' এর ঠিক আগে '' r 'থাকতে পারে।

আছে লাইন শেষা w শ তিন ধরনের টেক্সট ফাইলের মধ্যে দেখা গেছে: '\ এন' ইউনিক্স মেশিন, উপর '\ R' প্রচলিত বিভক্তি ছিল (আমি মনে করি) পুরাতন ম্যাক অপারেটিং সিস্টেমে ব্যবহার করা হয়, এবং Windows একজোড়া, '\ R' ব্যবহার '\ n' অনুসরণ করে

সমস্যাটি getlineস্ট্রিংয়ের শেষে '\ r' ছেড়ে যায়।

ifstream f("a_text_file_of_unknown_origin");
string line;
getline(f, line);
if(!f.fail()) { // a non-empty line was read
   // BUT, there might be an '\r' at the end now.
}

f.good()আমি যা চেয়েছিলাম তা তা নির্দেশ করার জন্য নীলকে ধন্যবাদ সম্পাদনা করুন!f.fail()আমি কি চাই

আমি নিজে নিজে এটি মুছে ফেলতে পারি (এই প্রশ্নের সম্পাদনা দেখুন), যা উইন্ডোজ পাঠ্য ফাইলগুলির জন্য সহজ। তবে আমি আশঙ্কা করছি যে কেউ কেবল '\ r' সমন্বিত একটি ফাইলে খাওয়াবে। সেক্ষেত্রে আমার ধারণা, গেটলাইন পুরো ফাইলটি গ্রাস করবে, এই ভেবে যে এটি একক লাইন!

.. এবং এটি ইউনিকোড :-) বিবেচনা করে না

.. সম্ভবত বুস্টের কোনও পাঠ্য-ফাইলের টাইপ থেকে একবারে একটি লাইন গ্রাস করার একটি দুর্দান্ত উপায় আছে?

সম্পাদনা করুন আমি উইন্ডোজ ফাইলগুলি হ্যান্ডেল করার জন্য এটি ব্যবহার করছি তবে আমার এখনও মনে হচ্ছে আমার দরকার নেই! এবং এটি কেবল '\ r' ফাইলগুলির জন্য কাঁটাচামচ করবে না।

if(!line.empty() && *line.rbegin() == '\r') {
    line.erase( line.length()-1, 1);
}

4
OS n এর অর্থ বর্তমান ওএসে উপস্থাপিত যেকোন উপায়ে নতুন লাইন। গ্রন্থাগার এটি যত্ন নেয়। কিন্তু যে কাজ করার জন্য, একটি প্রোগ্রাম উইন্ডোতে কম্পাইল জানালা থেকে টেক্সট ফাইল, একটি প্রোগ্রাম UNIX মধ্যে কম্পাইল করা, টেক্সট ফাইল UNIX ইত্যাদি থেকে পড়া উচিত
জর্জ Kastrinis

4
@ জর্জ, যদিও আমি লিনাক্স মেশিনে সংকলন করছি, মাঝে মাঝে আমি উইন্ডোজ মেশিন থেকে মূলত পাঠ্য ফাইলগুলি ব্যবহার করি। আমি আমার সফ্টওয়্যারটি (নেটওয়ার্ক বিশ্লেষণের জন্য একটি ছোট সরঞ্জাম) প্রকাশ করতে পারি এবং আমি ব্যবহারকারীদের বলতে সক্ষম হতে চাই যে তারা যে কোনও সময়ে (এএসসিআইআই-এর মতো) পাঠ্য ফাইলের মধ্যে ফিড দিতে পারে।
অ্যারন ম্যাকডেইড 22'11


4
মনে রাখবেন যে (f.good ()) আপনি যা ভাবেন বলে মনে হয় তা যদি না করে।

4
@JonathanMee: এটা মত হয়তো এই । হতে পারে.
অরবিট

উত্তর:


111

নীল যেমন উল্লেখ করেছেন, "সি ++ রানটাইমটি আপনার নির্দিষ্ট প্ল্যাটফর্মের জন্য লাইন এন্ডিং কনভেনশন যাই হোক না কেন সঠিকভাবে ডিল করা উচিত"

যাইহোক, লোকেরা বিভিন্ন প্ল্যাটফর্মের মধ্যে পাঠ্য ফাইলগুলি সরান, যাতে এটি যথেষ্ট ভাল না। এখানে একটি ফাংশন যা তিনটি লাইন শেষ ("\ r", "\ n" এবং "\ r \ n") পরিচালনা করে:

std::istream& safeGetline(std::istream& is, std::string& t)
{
    t.clear();

    // The characters in the stream are read one-by-one using a std::streambuf.
    // That is faster than reading them one-by-one using the std::istream.
    // Code that uses streambuf this way must be guarded by a sentry object.
    // The sentry object performs various tasks,
    // such as thread synchronization and updating the stream state.

    std::istream::sentry se(is, true);
    std::streambuf* sb = is.rdbuf();

    for(;;) {
        int c = sb->sbumpc();
        switch (c) {
        case '\n':
            return is;
        case '\r':
            if(sb->sgetc() == '\n')
                sb->sbumpc();
            return is;
        case std::streambuf::traits_type::eof():
            // Also handle the case when the last line has no line ending
            if(t.empty())
                is.setstate(std::ios::eofbit);
            return is;
        default:
            t += (char)c;
        }
    }
}

এবং এখানে একটি পরীক্ষা প্রোগ্রাম:

int main()
{
    std::string path = ...  // insert path to test file here

    std::ifstream ifs(path.c_str());
    if(!ifs) {
        std::cout << "Failed to open the file." << std::endl;
        return EXIT_FAILURE;
    }

    int n = 0;
    std::string t;
    while(!safeGetline(ifs, t).eof())
        ++n;
    std::cout << "The file contains " << n << " lines." << std::endl;
    return EXIT_SUCCESS;
}

4
@Miek: আমি নিম্নলিখিত পো ব্যক্তি পরামর্শ কোড আপডেট করেছি stackoverflow.com/questions/9188126/... এবং কিছু পরীক্ষা দৌড়ে। সবকিছু এখন যা করা উচিত হিসাবে কাজ করে।
জোহান রেড

4
@ থমাস ওয়েলার: প্রেরকের জন্য কনস্ট্রাক্টর এবং ডেস্ট্রাক্টর কার্যকর করা হয়। এটি থ্রেড সিঙ্ক্রোনাইজেশন, সাদা স্থান বাদ দেওয়া এবং স্ট্রিমের স্থিতি আপডেট করার মতো কাজ করে।
জোহান রাদে

4
ইওএফ ক্ষেত্রে, tইওফিটটি সেট করার আগে যা খালি তা যাচাইয়ের উদ্দেশ্য কী। অন্যান্য চরিত্রগুলি পড়া না করেই কি সেই বিট সেট করা উচিত নয়?
Yay295

4
Yay295: আপনি সর্বশেষ লাইনের শেষ প্রান্তে পৌঁছানোর সময় নয়, আপনি যখন শেষ লাইনের বাইরে পড়ার চেষ্টা করবেন তখন ইওফ পতাকাটি সেট করা উচিত। চেকটি নিশ্চিত করে যে এটি শেষ যখন শেষ লাইনে কোনও EOL না থাকে। (চেকটি অপসারণের চেষ্টা করুন, এবং তারপরে টেক্সট ফাইলটিতে পরীক্ষা প্রোগ্রামটি চালান যেখানে শেষ লাইনে কোনও ইওএল নেই, এবং আপনি দেখতে পাবেন))
জোহান রেড

4
এটি খালি শেষ লাইনটিও পড়ে, যা এমন কোনও আচরণ নয়std::get_line যা খালি শেষ রেখাটিকে উপেক্ষা করে। আমি std::get_lineআচরণটি অনুকরণ করতে is.setstate(std::ios::eofbit); if (t.empty()) is.setstate(std::ios::badbit); return is;
ইওফের

11

সি ++ রানটাইমটি আপনার নির্দিষ্ট প্ল্যাটফর্মের জন্য এন্ডলাইন কনভেনশন যাই হোক না কেন সঠিকভাবে ডিল করা উচিত। বিশেষত, এই কোডটি সমস্ত প্ল্যাটফর্মগুলিতে কাজ করা উচিত:

#include <string>
#include <iostream>
using namespace std;

int main() {
    string line;
    while( getline( cin, line ) ) {
        cout << line << endl;
    }
}

অবশ্যই, আপনি যদি অন্য প্ল্যাটফর্মের ফাইলগুলি নিয়ে কাজ করছেন তবে সমস্ত বেট বন্ধ রয়েছে।

দুটি অতি সাধারণ প্ল্যাটফর্ম হিসাবে (লিনাক্স এবং উইন্ডোজ) উভয়ই একটি নতুন লাইন চরিত্রের সাথে রেখাগুলি সমাপ্ত করে, উইন্ডোজ তার আগে ক্যারেজ রিটার্নের পূর্বে, আপনি lineউপরের কোডটিতে স্ট্রিংয়ের শেষ অক্ষরটি পরীক্ষা করে দেখতে পারেন এটি কিনা \rএবং যদি তাই হয় আপনার অ্যাপ্লিকেশন-নির্দিষ্ট প্রক্রিয়াজাতকরণ করার আগে এটি সরান।

উদাহরণস্বরূপ, আপনি নিজেকে একটি গেটলাইন স্টাইলের ফাংশন সরবরাহ করতে পারেন যা দেখতে এমন কিছু দেখায় (পরীক্ষিত নয়, সূচিপত্রের ব্যবহার, সাবস্ট্রাস্ট ইত্যাদি কেবলমাত্র শিক্ষাগত উদ্দেশ্যে):

ostream & safegetline( ostream & os, string & line ) {
    string myline;
    if ( getline( os, myline ) ) {
       if ( myline.size() && myline[myline.size()-1] == '\r' ) {
           line = myline.substr( 0, myline.size() - 1 );
       }
       else {
           line = myline;
       }
    }
    return os;
}

9
অন্য প্ল্যাটফর্মের ফাইলগুলি কীভাবে মোকাবেলা করা হবে সে সম্পর্কে প্রশ্ন ।
অরবিটে হালকাতা রেস

4
@ নীল, এই উত্তরটি এখনও যথেষ্ট নয়। আমি যদি সিআরএলএফগুলি পরিচালনা করতে চাইতাম তবে আমি স্ট্যাকওভারফ্লোতে আসতাম না। আসল চ্যালেঞ্জটি হ'ল যে ফাইলগুলিতে কেবল '\ r' থাকে তা হ্যান্ডেল করা। তারা আজকাল খুব বিরল, এখন যে ম্যাকওএস ইউনিক্সের কাছাকাছি চলে গেছে, তবে আমি ধরে নিতে চাই না যে সেগুলি কখনই আমার সফ্টওয়্যারকে খাওয়ানো হবে না।
অ্যারন ম্যাকডেইড

4
অ্যারন ভাল, আপনি যদি কিছু পরিচালনা করতে সক্ষম হন তবে আপনাকে এটি করতে নিজের কোড লিখতে হবে।

4
আমি প্রথম থেকেই আমার প্রশ্নের মধ্যে পরিষ্কার করে দিয়েছিলাম যে এটি কার্যকরভাবে করা সহজ, আমি বোঝাতে চাই যে আমি এটি করতে আগ্রহী এবং সক্ষম able আমি এটি সম্পর্কে জিজ্ঞাসা করেছি কারণ এটি একটি সাধারণ প্রশ্ন বলে মনে হচ্ছে, এবং এখানে বিভিন্ন ধরণের পাঠ্য-ফাইল ফর্ম্যাট রয়েছে। আমি ধরে নিয়েছি / আশা করেছি যে সি ++ স্ট্যান্ডার্ড কমিটি এটি তৈরি করেছে This এটি আমার প্রশ্ন।
অ্যারন ম্যাকডেইড

4
@ নীল, আমি মনে করি যে আমি / আমরা ভুলে গিয়েছি এমন আরও একটি সমস্যা আছে। তবে প্রথমে, আমি স্বীকার করি যে আমার পক্ষে সমর্থনযোগ্য কয়েকটি সংখ্যক ফর্ম্যাট শনাক্ত করার পক্ষে এটি ব্যবহারিক। অতএব, আমি এমন কোড চাই যা উইন্ডোজ এবং লিনাক্সে সংকলন করবে এবং যা উভয় বিন্যাসের সাথে কাজ করবে। আপনার safegetlineএকটি সমাধানের একটি গুরুত্বপূর্ণ অংশ। তবে এই প্রোগ্রামটি যদি উইন্ডোজে সংকলিত হয়, তবে আমারও কি বাইনারি ফর্ম্যাটে ফাইলটি খোলার দরকার আছে? উইন্ডোজ সংকলকগুলি (পাঠ্য মোডে) '\ n' কে '\ r' '\ n' এর মতো আচরণ করার অনুমতি দেয়? ifstream f("f.txt", ios_base :: binary | ios_base::in );
অ্যারন ম্যাকডেইড

8

আপনি ফাইল পড়া হয় বাইনারি বা টেক্সট মোড? ইন টেক্সট মোড যুগল গাড়ি ফেরত / লাইন ফিড, CRLF , যেমন ব্যাখ্যা করা হয় টেক্সট লাইনের শেষে, অথবা লাইন চরিত্র শেষে, কিন্তু বাইনারি আপনি শুধুমাত্র আনা এক একটি সময়ে বাইট, যার মানে যে হয় চরিত্র নয়অন্য বাইট হিসাবে আনার জন্য উপেক্ষা করে বাফারে রেখে দেওয়া হবে! ক্যারেজ রিটার্নের অর্থ, টাইপরাইটারে, টাইপ রাইটার গাড়িটি, যেখানে মুদ্রণ বাহুটি পড়ে আছে, কাগজের ডান প্রান্তে পৌঁছে বাম প্রান্তে ফিরে আসে is এটি একটি খুব যান্ত্রিক মডেল, যান্ত্রিক টাইপরাইটার এর। তারপরে লাইন ফিডের অর্থ হল যে কাগজ রোলটি খানিকটা উপরে আবর্তিত হবে যাতে কাগজ টাইপিংয়ের আরেকটি লাইন শুরু করার অবস্থানে থাকে। যত তাড়াতাড়ি আমার মনে আছে এএসসিআইআই-র মধ্যে একটি স্বল্প সংখ্যার অর্থ টাইপ না করে ডান এক চরিত্রে সরে যাওয়া, মৃত চর এবং অবশ্যই \ বি অর্থ ব্যাকস্পেস: গাড়িটিকে একটি অক্ষর পিছনে সরিয়ে নেওয়া। এইভাবে আপনি বিশেষ প্রভাব যুক্ত করতে পারেন, যেমন অন্তর্নিহিত (টাইপ আন্ডারস্কোর), স্ট্রাইকথ্রু (টাইপ বিয়োগ), আনুমানিক বিভিন্ন উচ্চারণ, প্রসারিত কীবোর্ডের প্রয়োজন ছাড়াই বাতিল (এক্স টাইপ), লাইন ফিডে প্রবেশের আগে কেবল লাইন বরাবর গাড়ির অবস্থান সামঞ্জস্য করে। সুতরাং আপনি কম্পিউটার না করে কোনও টাইপরাইটারকে স্বয়ংক্রিয়ভাবে নিয়ন্ত্রণ করতে বাইট মাপের এএসসিআইআই ভোল্টেজ ব্যবহার করতে পারেন। স্বয়ংক্রিয় টাইপরাইটার চালু করা হলে,অটোম্যাটিক মানে এই যে আপনি একবার কাগজের সর্বাধিক প্রান্তে পৌঁছালে গাড়িটি বাম দিকে ফিরে আসবে এবং লাইন ফিড প্রয়োগ করা হবে, অর্থাৎ রোলটি উপরে উঠে যাওয়ার সাথে সাথে গাড়িটি স্বয়ংক্রিয়ভাবে ফিরে আসবে বলে মনে করা হচ্ছে! সুতরাং আপনার উভয় নিয়ন্ত্রণ অক্ষর, কেবল একটি, \ n, নতুন লাইন বা লাইন ফিডের প্রয়োজন নেই।

প্রোগ্রামিংয়ের সাথে এর কোনও যোগসূত্র নেই তবে এএসসিআইআই এর বয়স বেশি এবং তিনি! দেখে মনে হচ্ছে কিছু লোকেরা যখন পাঠ্য কাজ করা শুরু করেছিল তখন তারা চিন্তা করছিল না! ইউএনআইএক্স প্ল্যাটফর্ম একটি বৈদ্যুতিক স্বয়ংক্রিয় টাইপম্যাচিন ধরে নেয়; উইন্ডোজ মডেলটি আরও সম্পূর্ণ এবং যান্ত্রিক মেশিনগুলির নিয়ন্ত্রণের জন্য অনুমতি দেয়, যদিও কিছু কন্ট্রোল অক্ষর কম্পিউটারে বেল চরিত্রের মতো কমপক্ষে দরকারী হয়ে ওঠে, যদি আমি ভালভাবে মনে করি তবে ... কিছু ভুলে যাওয়া পাঠ্য অবশ্যই মূল কন্ট্রোল ক্যারেক্টারের সাহায্যে ধরা পড়েছিল বৈদ্যুতিক নিয়ন্ত্রিত টাইপরাইটারগুলির জন্য এবং এটি মডেলকে স্থায়ী করে ...

প্রকৃতপক্ষে সঠিক প্রকরণটি হ'ল কেবলমাত্র \ r, লাইন ফিড অন্তর্ভুক্ত করা, গাড়ীর ফিরে আসা অপ্রয়োজনীয়, অর্থাৎ স্বয়ংক্রিয়, তাই:

char c;
ifstream is;
is.open("",ios::binary);
...
is.getline(buffer, bufsize, '\r');

//ignore following \n or restore the buffer data
if ((c=is.get())!='\n') is.rdbuf()->sputbackc(c);
...

সব ধরণের ফাইল হ্যান্ডেল করার সবচেয়ে সঠিক উপায় হবে। নোট তবে যে \ n টেক্সট মোড আসলে বাইট যুগল 0x0d 0x0a, কিন্তু 0x0d IS শুধু পান \ r: \ n \ দ অন্তর্ভুক্ত টেক্সট মোড কিন্তু না বাইনারি , তাই \ N এবং \ r \ N হয় সমতুল্য ... অথবা হতে হবে. এটি আসলে খুব বেসিক শিল্প বিভ্রান্তি, সাধারণ শিল্প জড়তা, কারণ কনভেনশনটি সমস্ত প্ল্যাটফর্মে সিআরএলএফের কথা বলতে হয়, তারপরে বিভিন্ন বাইনারি ব্যাখ্যায় পড়ে যায়। কঠোরভাবে বলতে সহ, ফাইল কেবলমাত্র হচ্ছে \ N (CRLF বা লাইন ফিড) হিসেবে 0x0d (গাড়ি ফেরত), মধ্যে বিকৃত হয়েছে করছে টেক্সটমোড (টাইপরাইটার মেশিন: কেবল গাড়িটি ফিরিয়ে দিন এবং স্ট্রাইকথ্রু সবকিছু ...), এবং এটি একটি নন-লাইন ভিত্তিক বাইনারি ফর্ম্যাট (হয় \ r বা \ r \ n অর্থ লাইনমুখী) যাতে আপনি পাঠ্য হিসাবে পড়েন না! কোডটি অবশ্যই কিছু ব্যবহারকারীর বার্তার সাথে ব্যর্থ হওয়া উচিত। এটি কেবল ওএসের উপর নির্ভর করে না, তবে সি লাইব্রেরি বাস্তবায়নের উপরও বিভ্রান্তি এবং সম্ভাব্য প্রকরণগুলিকে যুক্ত করে ... (বিশেষত স্বচ্ছ ইউনিকোড অনুবাদ অনুবাদ স্তরগুলির জন্য বিভ্রান্তিকর পরিবর্তনের জন্য বক্তব্যকে আরও একটি পয়েন্ট যুক্ত করে)।

পূর্ববর্তী কোড স্নিপেট (যান্ত্রিক টাইপরাইটার) এর সাথে সমস্যাটি হ'ল very r (স্বয়ংক্রিয় টাইপরাইটার পাঠ্য) পরে কোনও characters n অক্ষর না থাকলে এটি খুব অদক্ষ। তারপরে এটি BINARY মোডও ধরে নেয় যেখানে সি লাইব্রেরি পাঠ্য ব্যাখ্যা (লোকেল) উপেক্ষা করে নিখুঁত বাইটগুলি দিতে বাধ্য হয়। সেখানে উভয় মোড মধ্যে প্রকৃত টেক্সট অক্ষর কোন পার্থক্য কেবল নিয়ন্ত্রণ অক্ষর হওয়া উচিত, তাই সাধারণত পড়া ভাষী বাইনারি বেশী ভালো টেক্সট মোড। এই সমাধানটি বিনের জন্য কার্যকরমোড সাধারণ উইন্ডোজ ওএস পাঠ্য ফাইলগুলি স্বাধীনভাবে সি লাইব্রেরির বিভিন্নতার পরিবর্তিত, এবং অন্যান্য প্ল্যাটফর্মের পাঠ্য বিন্যাসগুলির (অক্ষরে ওয়েব অনুবাদ সহ) অক্ষম। যদি আপনি দক্ষতার বিষয়ে যত্নশীল হন, যাওয়ার উপায়টি হল কোনও ফাংশন পয়েন্টার ব্যবহার করা, vs r বনাম \ r \ n লাইন নিয়ন্ত্রণের জন্য আপনার পছন্দ মতো উপায় পরীক্ষা করা, তবে পয়েন্টারে সেরা গেটলাইন ব্যবহারকারী-কোডটি নির্বাচন করুন এবং এটি থেকে অনুরোধ করুন এটা।

ঘটনাক্রমে আমার মনে আছে আমি কিছু \ r \ r \ n টেক্সট ফাইলও পেয়েছি ... যা কিছু মুদ্রিত পাঠ্য গ্রাহকরা এখনও প্রয়োজনীয়ভাবে ডাবল লাইনের পাঠ্যে অনুবাদ করে।


"আইওএস :: বাইনারি" এর জন্য +1 - কখনও কখনও আপনি ফাইলটি যেমন পড়তে চান (যেমন একটি চেকসাম গণনা করার জন্য) রানটাইমটি লাইনের শেষ পরিবর্তন না করেই করে।
ম্যাথিয়াস

2

একটি সমাধান হ'ল প্রথমে অনুসন্ধান এবং সমস্ত রেখার শেষটি '\ n' এ প্রতিস্থাপন করা - যেমন গিট ডিফল্টরূপে করে।


1

আপনার নিজস্ব কাস্টম হ্যান্ডলারটি লেখা বা বাহ্যিক লাইব্রেরি ব্যবহার করা বাদে আপনার ভাগ্য নেই। সবচেয়ে সহজ কাজটি line[line.length() - 1]'\ r' নয় তা নিশ্চিত করে পরীক্ষা করা । লিনাক্সে এটি অতিমাত্রায় কার্যকর কারণ বেশিরভাগ লাইন '' n 'দিয়ে শেষ হবে, অর্থাত যদি এটি লুপে থাকে তবে আপনি একটি মোটামুটি সময় হারাবেন। উইন্ডোজে এটিও অতিরিক্ত অতিরিক্ত। যাইহোক, ক্লাসিক ম্যাক ফাইলগুলির কী হবে যা '' r 'এ শেষ হয়? std :: getline লিনাক্স বা উইন্ডোজের সেই ফাইলগুলির জন্য কাজ করবে না কারণ '\ n' এবং '\ r' '\ n' উভয়ই '\ n' দিয়ে শেষ হয়, '\ r' এর জন্য চেক করার প্রয়োজনীয়তা বাদ দেয়। স্পষ্টতই এই জাতীয় কোনও ফাইল যা এই ফাইলগুলির সাথে কাজ করে তা ভাল কাজ করবে না। অবশ্যই, তারপরে অসংখ্য EBCDIC সিস্টেম রয়েছে, এমন কিছু যা বেশিরভাগ লাইব্রেরিগুলি মোকাবেলা করার সাহস করে না।

'' R 'এর জন্য পরীক্ষা করা সম্ভবত আপনার সমস্যার সেরা সমাধান। বাইনারি মোডে পড়া আপনাকে তিনটি সাধারণ লাইনের শেষ ('\ r', '\ r \ n' এবং '\ n') পরীক্ষা করতে দেয় allow আপনি যদি লিনাক্স এবং উইন্ডোজ সম্পর্কে কেবল পুরানো-শৈলীর ম্যাক লাইনের সমাপ্তি বেশি সময় না ঘটাতে চান তবে কেবল '\ n' এর জন্য পরীক্ষা করুন এবং '\ r' অক্ষরটি সরিয়ে ফেলুন।


0

প্রতিটি লাইনে কত আইটেম / সংখ্যা রয়েছে তা যদি জানা থাকে তবে একজন একটি লাইন যেমন 4 নম্বর হিসাবে পাঠ করতে পারে

string num;
is >> num >> num >> num >> num;

এটি অন্যান্য লাইনের শেষের সাথেও কাজ করে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.