【问题标题】:Combining two files full of numbers into a third, sorted file. Issue with filenames and cin将两个充满数字的文件组合成第三个已排序的文件。文件名和 cin 问题
【发布时间】:2013-11-21 09:01:55
【问题描述】:

我有以下代码...

http://pastebin.com/KjzArbcg ^ 完整代码

//the issue - this throws a Segmentation fault
char *inname1 = "HW11F1.txt";
cin >> inname1;
ifstream infile1(inname1);

任务如下.. “编写一个程序,将两个文件中的数字合并,并将所有数字写入一个 第三个文件。每个输入文件都包含一个 int 类型的数字列表,这些数字从 最小到最大。程序运行后,输出文件将包含所有 两个输入文件中的数字按从小到大的顺序排列在一个较长的列表中。 您的程序应该定义一个使用两个输入文件流调用的函数和 输出文件流作为三个参数。”

我让它适用于默认文件名就好了,一切似乎都按我想要的方式工作。问题是当我尝试做 cin >> inname1;

程序因分段错误(核心转储)而崩溃。知道我做错了什么,或者如何解决它?提前致谢。

【问题讨论】:

  • 使用std::string 而不是char*
  • 请直接在问题中发布您的代码,如果程序相当长,请去掉所有不必要的内容,直到您得到一个最小的测试用例,我们可以复制并复制以查看错误。 (出于某种原因,pastebin 无论如何都被我阻止了)。
  • @KirilKirov or 可能很少使用,但它和|| 一样标准。
  • @KirilKirov 不,不是。它仍然是完全合法的,没有被弃用。
  • @user2993567 不,这不好。根据 Stack Overflow 政策,所有问题和答案都应该是独立的。外部链接可用于非必要的补充材料,但没有它们,每个帖子仍然有意义。

标签: c++ arrays string char cin


【解决方案1】:
char *inname1 = "HW11F1.txt";

这使得inname1 指向只读字符文字"HW11F1.txt"

cin >> inname1;

这试图读入那个文字,当然失败了(文字可能存储在只读内存中)。

鉴于您使用的是 C++ 而不是 C,因此您应该尽可能避免使用 C 样式的字符串,而是使用 std::string

在 C++11 之前,文件流构造函数只接受 C 风格的字符串,因此您必须像这样修改流构造:

ifstream infile1(inname1.c_str());

【讨论】:

    【解决方案2】:

    问题是 inname1 没有正确分配。如果您改用 std::string(如 Kiril Kirov 所建议的那样),它将分配必要的字节数以在复制之前存储来自 cin 的输入。

    【讨论】:

    • puu.sh/5oOfP.png - 我刚刚将 char *inname3 更改为 std::string inname3 (对于所有三个),它会引发此错误。
    • @user2993567 查看我对这个问题的最新评论。使用c_str()
    【解决方案3】:

    好的,这就是我修复它的方法。

    #include <string> 
    #include <iostream>
    
    std::string inname1 = "HW11F1.txt";
    std::string inname2 = "HW11F2.txt";
    std::string inname3 = "output.txt";
    cin >> inname1; 
    
    //blah blah blah
    
    std::ifstream infile1 (inname1.c_str());
    
    //blah blah blah
    
    std::ofstream outfile (inname3.c_str());
    outfile.open(inname3.c_str());
    

    这是最后一件事的粘贴箱(好吧,手头的问题是固定的)...

    http://pastebin.com/V6VErNDC

    感谢所有提供帮助的人。 Stackoverflow 似乎总能救我一命。

    【讨论】:

      猜你喜欢
      • 2016-10-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-13
      • 1970-01-01
      相关资源
      最近更新 更多