سؤال

ifstream::tellg() يعود -13 لملف معين.

في الأساس ، كتبت فائدة تحلل بعض التعليمات البرمجية المصدر ؛ أفتح جميع الملفات أبجديًا ، أبدأ بـ "Apple.cpp" وهو يعمل بشكل مثالي .. ولكن عندما يصل إلى "conversion.cpp" ، دائمًا على نفس الملف ، بعد قراءة سطر واحد بنجاح tellg () إرجاع -13.

الرمز المعني هو:

for (int i = 0; i < files.size(); ++i) { /* For each .cpp and .h file */
   TextIFile f(files[i]);
   while (!f.AtEof()) // When it gets to conversion.cpp (not on the others)
                      // first is always successful, second always fails
      lines.push_back(f.ReadLine());

الرمز ل AtEof هو:

    bool AtEof() {
        if (mFile.tellg() < 0)
            FATAL(format("DEBUG - tellg(): %d") % mFile.tellg());
        if (mFile.tellg() >= GetSize())
            return true;

        return false;
    }

بعد أن يقرأ بنجاح السطر الأول من التحويل DEBUG - tellg(): -13.

هذا كله TextIFile الفصل (كتبني ، قد يكون الخطأ هناك):

class TextIFile
{
public:
    TextIFile(const string& path) : mPath(path), mSize(0) {
        mFile.open(path.c_str(), std::ios::in);

        if (!mFile.is_open())
            FATAL(format("Cannot open %s: %s") % path.c_str() % strerror(errno));
    }

    string GetPath() const { return mPath; }
    size_t GetSize() { if (mSize) return mSize; const size_t current_position = mFile.tellg(); mFile.seekg(0, std::ios::end); mSize = mFile.tellg(); mFile.seekg(current_position); return mSize; }

    bool AtEof() {
        if (mFile.tellg() < 0)
            FATAL(format("DEBUG - tellg(): %d") % mFile.tellg());
        if (mFile.tellg() >= GetSize())
            return true;

        return false;
    }

    string ReadLine() {
        string ret;
        getline(mFile, ret);
        CheckErrors();
        return ret;
    }

    string ReadWhole() {
        string ret((std::istreambuf_iterator<char>(mFile)), std::istreambuf_iterator<char>());
        CheckErrors();
        return ret;
    }

private:
    void CheckErrors() {
        if (!mFile.good())
            FATAL(format("An error has occured while performing an I/O operation on %s") % mPath);
    }

    const string mPath;
    ifstream mFile;
    size_t mSize;
};

النظام الأساسي هو Visual Studio ، 32 بت ، Windows.

تعديل: يعمل على Linux.

تعديل: لقد وجدت السبب: نهايات الخط. كان لكل من التحويل و GUID وآخرون n بدلاً من r n. لقد أنقذتهم مع r n بدلاً من ذلك وعمل. ومع ذلك ، ليس من المفترض أن يحدث هذا؟

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

المحلول

من الصعب التخمين دون معرفة ما هو عليه بالضبط Conversion.cpp. ومع ذلك ، باستخدام < مع مواقف الدفق لا يتم تعريفها بواسطة المعيار. قد ترغب في النظر في مجموعة صريحة إلى نوع عدد صحيح الصحيح قبل تنسيقه ؛ لا أعرف ما هو التنسيق FATAL و format() توقع أداء أو كيف % المشغل مثقل. لا يتعين على مواضع الدفق أن تعين بطريقة قابلة للتمكين للأعداد الصحيحة ، وبالتأكيد ليس إذا لم يتم فتح الملف في الوضع الثنائي.

قد ترغب في التفكير في تطبيق بديل ل AtEof(). قل شيئًا مثل:

bool AtEof()
{
    return mFile.peek() == ifstream::traits_type::eof();
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top