【问题标题】:Ifstream is not working如果流不工作
【发布时间】:2013-09-24 16:49:58
【问题描述】:
#include <fstream>
#include <string>
#include <iostream>
#include "Gyvūnas.h"
#include "Maistas.h"
using namespace std;

//-------------------------------------------------------
const char CFm[] = "Maistas.txt";
const char CFg[] = "Gyvūnai.txt";
const int CMax   = 100;
//-------------------------------------------------------

//--------------------------------------------------------
void Skaityti  (const char CFm[], Maistas M[], int & n);
void Skaityti2 (Gyvūnas G[], int & kg);
//----------------------------------------------------------
int main(){
    setlocale (LC_ALL , "Lithuanian");
    Maistas M[CMax];
    Gyvūnas G[CMax];
    int n;
    int kg;
    Skaityti  (CFm, M, n);
    Skaityti2 (G, kg);
    cout << M[1].ImtiMetus() << " " << n << endl;
    system ("PAUSE");
    return 0;
}
//----------------------------------------------------------
void Skaityti (const char CFm[], Maistas M[], int & n)
{
    string produktas;
    double kiekis;
    int metai;
    int mėnuo;
    int diena;
    ifstream fd(CFm);
    fd >> n;
    for (int i = 0 ; i<=n ; i++){ 
        fd >> produktas >> kiekis >> metai >> mėnuo >> diena;
        M[i].Dėti(produktas, kiekis, metai, mėnuo, diena);
    }
    fd.clear ();
    fd.close();
}
void Skaityti2 (Gyvūnas G[], int & kg)
{
    int narvas;
    string pavadinimas;
    int skaičius;
    int produktas;
    int kiekis;
    int n;
    ifstream fd(CFg);
    fd >> n;
    for (int i = 0 ; i<=kg ; i++){
        fd >> narvas >> pavadinimas >> skaičius >> produktas >> kiekis;
        G[i].Dėti(narvas, pavadinimas, skaičius, produktas, kiekis);
    }
    kg = n;
    fd.close();
}

当我设置断点时,它表明在这部分 ifstream 无法从文件中读取变量 n:

 ifstream fd(CFm);
    fd >> n;
    for (int i = 0 ; i<=n ; i++){ 
        fd >> produktas >> kiekis >> metai >> mėnuo >> diena;
        M[i].Dėti(produktas, kiekis, metai, mėnuo, diena);
    }
    fd.clear ();
    fd.close();

错误是:

std::basic_ios

文件缓冲区 {_Set_eback=0xcccccccc _Set_egptr=0xcccccccc ...} std::basic_filebuf >

【问题讨论】:

  • 文件的内容是什么?尝试使用 std::string s; if (std::getline(fd, s)) { std::cout &lt;&lt; "read='" &lt;&lt; s &lt;&lt; "'\n"; } else { std::cout &lt;&lt; "failed to read anything\n"; } 读取一行,这应该可以指示正在发生的事情。

标签: c++ utf-8


【解决方案1】:

尝试将Gyvūnai.txt 重命名为Gyvunai.txt。 使用非 ascii 符号作为变量名和函数名是不好的做法 (Dėti,skaičius),尽管 Visual Studio 允许这样做,但使用带有非 ascii 符号的字符串文字更糟糕 - 实际的字符代码将取决于源文件的编码和编译器代码页设置。编译器可以将源代码视为 CP1251,而它实际上是 UTF-8 并且有两个字符表示 ū

【讨论】:

    【解决方案2】:

    你所拥有的不是错误,只是指针的值。您似乎无法打开CFm 文件。请确认您的工作目录中是否真的有Maistas.txt(为了测试,您可以将其移动到C:\Maistas.txt,然后将"C:\\Maistas.txt"作为绝对文件路径传递。

    此外,还有一种方法可以检查 ifstream 是否正确打开 - 您可以通过检查 failbit 来做到这一点:

    ifstream fd(CFm);
    if(!fd.good())
    {
       cerr << "Could not open the file!" << endl;
       return;
    }
    

    【讨论】:

    • 我已经尝试进行故障位检查,它表明文件正在正确打开。尝试读取 n 时问题仍然存在。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-19
    • 2016-01-15
    • 2011-06-21
    • 2018-03-21
    • 2014-05-15
    • 2012-09-06
    相关资源
    最近更新 更多