【问题标题】:how do I open and read a file using ifstream in C++?如何在 C++ 中使用 ifstream 打开和读取文件?
【发布时间】:2010-07-25 02:01:24
【问题描述】:

我想打开一个文件并从中读取一行。文件中只有一行,所以我真的不需要担心循环,尽管为了将来参考,知道如何读取多行会很好。

int main(int argc, const char* argv[]) {

    // argv[1] holds the file name from the command prompt

    int number = 0; // number must be positive!

    // create input file stream and open file
    ifstream ifs;
    ifs.open(argv[1]);

    if (ifs == NULL) {
        // Unable to open file
        exit(1);
    } else {
        // file opened
        // read file and get number
        ...?
        // done using file, close it
        ifs.close();
    }
}

我该怎么做?另外,就成功打开而言,我是否正确处理了文件打开?

谢谢。

【问题讨论】:

  • 你有 C++ 书吗?如果是这样,您是否看过它讨论标准 I/O 库的章节?如果没有,我强烈建议您购买一本The Definitive C++ Book Guide and List 中列出的入门书籍。
  • 我没有 C++ 书籍。我在看cplusplus.com/reference/iostream/istream/getline,被streamsize n 参数弄糊涂了。
  • 如果你点击streamsize页面,它会说:“该类型是有符号基本整数类型之一的实现定义的同义词(通常有符号整数或有符号长整数)。”跨度>
  • ns 指向的缓冲区的大小。如果您使用全局getline 而不是成员getline,那么您不必担心该参数,因为全局getline 读入std::string 对象而不是缓冲区,而std::string 对象可调整大小。

标签: c++ file-io ifstream


【解决方案1】:

有几点:

  1. 您可以使用>> 流提取运算符读取数字:ifs >> number

  2. 标准库函数getline 将从文件中读取一行,如果您需要整行文本。

  3. 要检查文件是否打开,只需写if (ifs)if (!ifs)。省略== NULL

  4. 您不需要在最后显式关闭文件。当ifs 变量超出范围时,这将自动发生。

修改后的代码:

if (!ifs) {
    // Unable to open file.
} else if (ifs >> number) {
    // Read the number.
} else {
    // Failed to read number.
}

【讨论】:

  • .. 我将如何处理空格?
  • 默认情况下,空格由操作员静默删除>>
【解决方案2】:

对于你在这里所做的,简单地说:

ifs >> number;

将从流中提取一个数字并将其存储在“数字”中。

循环,取决于内容。如果都是数字,类似:

int x = 0;
while (ifs >> numbers[x] && x < MAX_NUMBERS)
{
 ifs >> number[x];
 x++;
}

可以将一系列数字存储在数组中。这是有效的,因为如果提取成功,提取操作符的副作用为真,如果提取失败,则为假(由于文件结尾或磁盘错误等)

【讨论】:

  • (如果有人在前 2 分钟看到这个,我在第一遍中省略了实际提取)
  • 呵呵,下次忍者直接编辑,什么也不说。这就是堆栈溢出方式。
  • @Feaelin... 我将如何处理空格?如果该行是类似于 `15 , I just want to get 15` 的东西。
  • @Hristo 空白被&gt;&gt; 跳过。试试看!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多