سؤال

لقد كنت في جميع أنحاء الأسئلة Ifstream هنا على ذلك، ما زلت أواجه مشكلة في قراءة ملف نصي بسيط. أنا أعمل مع Visual Studio 2008.

إليك الرمز الخاص بي:

// CPPFileIO.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <fstream>
#include <conio.h>
#include <iostream>
#include <string>

using namespace std;


int _tmain(int argc, _TCHAR* argv[])
{

    ifstream infile;
    infile.open("input.txt", ifstream::in);

    if (infile.is_open())
    {
        while (infile.good())
            cout << (char) infile.get();
    }
    else
    {
        cout << "Unable to open file.";
    }
    infile.close();
    _getch();
    return 0;
}

لقد أكدت أن Input.txt. الملف في "دليل العمل" الصحيح عن طريق التحقق من قيمة argv[0]. وبعد الطريقة المفتوحة لن تعمل فقط.

أواجه أيضا مشكلة في تصحيح الأخطاء - يجب ألا أكون قادرا على تعيين ساعة infile.good() أو infile.is_open()ب أظل الحصول على

Error: member function not present.

تعديل: أدخل الرمز الإدراج مع رمز كامل من ملف .cpp.

تحديث: لم يكن الملف في دليل العمل الحالي. هذا هو الدليل الذي ملف المشروع يقع. نقله هناك ويعمل عند تصحيح الأخطاء في vs.net.

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

المحلول

حاول استخدام Sitwise أو المشغل عند تحديد الوضع المفتوح.

infile.open ("input.txt", ios::ate | ios::in);

ال OpenMode. المعلمة هي bitmask. ios::ate يستخدم لفتح الملف لإلحاق، و ios::in يستخدم لفتح الملف لإدخال القراءة.

إذا كنت ترغب فقط في قراءة الملف، فمن المحتمل أن تستخدم فقط:

infile.open ("input.txt", ios::in);

الوضع الافتراضي الافتراضي ل iFstream هو iOS :: في، حتى تتمكن من التخلص من ذلك تماما. تعامل التعليمة البرمجية التالية بالنسبة لي باستخدام G ++.

#include <iostream>
#include <fstream>
#include <cstdio>

using namespace std;

int main(int argc, char** argv) {
    ifstream infile;
    infile.open ("input.txt");

    if (infile)
    {
        while (infile.good())
            cout << (char) infile.get();
    }
    else
    {
        cout << "Unable to open file.";
    }
    infile.close();
    getchar();
    return 0;
}

نصائح أخرى

في بعض الأحيان يقوم Visual Studio بوضع ملف EXE الخاص بك بعيدا عن التعليمات البرمجية المصدرية. بشكل افتراضي، قد تبحث VS فقط عن الملف بدءا من ملف EXE الخاص بك. هذه العملية هي خطوة بسيطة للحصول على ملف الإدخال TXT من نفس الدليل مثل شفرة المصدر الخاصة بك. يجب أن لا ترغب في إصلاح إعداد IDE الخاص بك.

using namespace std;

ifstream infile;

string path = __FILE__; //gets source code path, include file name
path = path.substr(0,1+path.find_last_of('\\')); //removes file name
path+= "input.txt"; //adds input file to path

infile.open(path);

نأمل أن يساعد ذلك الآخرين على حل سريع. استغرق الأمر مني بعض الوقت للعثور على هذا الإعداد بنفسي.

لقد وجدت مشكلتين في التعليمات البرمجية الخاصة بك:

أ) خطأ في بناء الجملة في "iOS :: ate || iOS :: in" => يجب أن يكون "ios :: ate | iOS :: in"

ب) "iOS :: ATE" يعين المؤشر إلى نهاية الملف - لذلك لا تحصل على شيء عند بدء القراءة

لذلك فقط قم بإزالة "iOS :: أكل" وأنت بخير :)

تشاو، كريس

infile.open ("input.txt", ios::ate || ios::in);

|| هو المنطقي أو المشغل، وليس المشغل bitwise (مثل مشروع القانون قال ليزارد).

لذلك أعتقد أنك تفعل ما يعادل:

infile.open ("input.txt", true);

(على افتراض عدم أيا من ios :: ate or ios :: in 0)

جرب استخدام:

ifstream fStm("input.txt", ios::ate | ios::in);

أواجه أيضا مشكلة في التصحيح - يجب ألا أكون قادرا على تعيين ساعة على "infile.good ()" أو "infile.is_open ()"؟ أظل الحصول على "خطأ: وظيفة الأعضاء غير موجودة".

ويشمل السليم:

#include <fstream> 

إلخ.

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