【问题标题】:Visual C++ - Cannot open text fileVisual C++ - 无法打开文本文件
【发布时间】:2013-07-26 01:31:54
【问题描述】:

打开文件并读取其内容的简单程序。然后在最后进行测试,看看我是否确实得到了信息。每次我运行它时,它都会告诉我它无法打开文件。我将在下面发布 SaleSlips 的内容。为什么打不开文件?它还尝试在每次运行时删除该文件。

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

struct SaleSlip{
    char name[20];
    int prodID;
    double value;
};

void main(){

    fstream slips;
    SaleSlip sales[17];
    slips.open("SaleSlips.txt", ios::in);
    if(slips.eof()){
        cout << "Cannot open file - SaleSlips.txt"<< endl;
        system("pause");
        exit(2);
    }
    int i = 0;
    while(!slips.eof()){
        slips.getline(sales[i].name, ' ');
        slips >> sales[i].prodID;
        slips.ignore(5, ' ');
        slips >> sales[i].value;
        slips.ignore(80, ' ');
        i++;
    }
    cout << sales[1].value;
    slips.close();
    system("pause");
}

Eric   1 200000.00
Sookie 2    200.00
Sookie 4    200.50

【问题讨论】:

    标签: c++ visual-studio-2010 visual-c++


    【解决方案1】:

    您正在使用ios::out 在输出模式下打开流。使用ios::in 读取它。

    你还有很多其他问题。即:

    -文件打开后的if(!slips.eof())总是会导致退出,除非文件为空。
    - 在您的 while 循环中,您(可能不小心)尝试使用 &lt;&lt; 将 prodID 和值写入单据文件。使用 &gt;&gt; 从流中读取,使用 &lt;&lt; 写入。

    【讨论】:

    • 哈哈,可悲的是,我之前尝试过,但给了我一些奇怪的错误。我又试了一次,还是打不开。是的,条件不对,我现在觉得很愚蠢....
    • 您现在遇到什么错误?我刚刚注意到您需要将 cout &lt;&lt; sales[i].name 移动到您的 while 循环中。否则可能会导致崩溃,因为索引 i 处的 SaleSlip 将没有名称值。
    • 我的天哪。好的,所以我让它“读取”它,但是现在一旦命令控制台打开它就会说 project.exe 不再是工作人员,并且在我意识到它做了什么之后我将其更改为 1。 system("pause") 只是为了让我可以看到输出是什么,忽略它。
    • 根据cplusplus.com/reference/fstream/fstream,我认为您在 while 循环中的某些函数调用有误。 Getline 的第二个参数需要是一个 streamsize ,字符分隔符(空格)是第三个参数。忽略调用将参数切换:它应该首先采用流大小,然后是分隔符。
    • 我调试了它(尽管我从来没有真正学会如何,但我想通了),调试非常有用。我希望我们最初学会它...谢谢 Egg
    【解决方案2】:

    你有两个问题:

    您正在打开文件以进行输出(写入)

    slips.open("SaleSlips.txt", ios::out);
    

    使用ios::in 代替输入(读取)

    slips.open("SaleSlips.txt", ios::in);
    

    接下来,您将立即测试!eof(),这是错误的逻辑。

    if(!slips.eof())
    

    希望在打开文件进行输入时位于eof()eof()end of file。首次打开文件进行输入时,您希望位于文件的开头;在eof() 是一件坏事。如果eof() 为真,您的代码应该会出错,而不是如果它是假的:

    if(slips.eof()) {
      // It's an error if we're starting at eof()
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-25
      • 2012-07-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多