当前位置: 首页 > 面试题库 >

Linux | C ++中的分段错误-由于函数ifstream

百里沛
2023-03-14
问题内容

我想我首先要说的是,我刚刚在我的电脑中安装了linux(debian),并且对在linux中做事的知识只有零。这个问题可能是由于一些非常简单的事情造成的。

代码的相关部分与此类似:

ifstream stockNames("names.txt");

    while (!stockNames.eof())
    {
        string snline;
        getline(stockNames,snline);
        cout << snline << endl;
        .
        .
        .
    }

这应该打印文件“ names.txt”的第一行。而是打印一个空行。当我尝试将snline用作另一个函数的输入时,出现错误“ Segmentation
Fault”。我应该如何修改我的代码来做到这一点?在Linux中使用ifstream有什么区别吗?在Windows中导致代码正常工作

我在下面写了简单的代码

#include <string>
#include <fstream>
#include <iostream>

using namespace std;

int main(int argc, const char *argv[])
{
    string dos = "names.txt";
    ifstream stockNames(dos.c_str() );

    string snline;
    while (getline(stockNames,snline))
    {
       cout << snline << " ";

    }
    return 0;
}

names.txt的内容为

美国广播公司

DEFG

高压氧

而不是显示这些行,cout << snline不会产生任何结果

再更新一次:我又写了两个代码。

(1)

#include <string>
#include <fstream>
#include <iostream>

using namespace std;

int main(int argc, const char *argv[])
{
    cout << "program has initiated" << endl;

    ifstream stockNames("names.txt");

    if( !stockNames )
        cout << "unable to open" << endl;

    string snline;
    while (getline(stockNames,snline))
    {
        cout << snline << endl;

    }
    return 0;
}

结果如我所愿。首先是“程序已启动”,然后是ABC,DEFG,HBO在不同领域。但是当我改变这部分

        cout << snline << endl;

        cout << snline << " hey" << endl;

然后,不会出现ABC DEFG HBO,而是唯一的输出是“嘿”。

这太疯狂了,怎么可能呢?

顺便说一句,我尝试用ddd进行调试,当我检查变量snline时,ddd打印以下行(gdb)print snline $ 2 = {static npos =
4294967295,_M_dataplus = {> = {<__ gnu_cxx :: new_allocator> = {} ,},_M_p =
0x804c1a4“ ABC \ r”}}

新的迷你更新:当我将相关行更改为“ cout << snline <<”“ << << endl;”时
打印出来的是单独行中的’BC’‘FGH’‘BO’。为什么<<操作符会覆盖snline?


问题答案:

您有一个dos文件,在每行末尾使用\ r \ n。Linux无法将\ r视为行尾的一部分,因此它会包含在snline字符串中。\
r导致打印的下一行内容出现在该行的开头,因此“嘿”将覆盖您期望看到的股票名称。

尝试

cout << snline << " " << endl;

你会明白我的意思



 类似资料:
  • 我在实现合并排序时遇到了分段错误。我已经检查了数组是否超出边界。我想得到一些帮助,找出我哪里出了问题。我尝试过小数组的输入,例如大小为10的数组,我将temp的大小作为静态值( 更新:我只需要改变mid=(低高)/2。

  • 问题内容: 我试图运行此shellcode,但它使我抛出:“ Segmentation fault”错误shellcode如下: shellcode.asm: 我将其编译为:’nasm -f elf shellcode.asm’并将其链接为:’ld -m elf_i386 -s -o shellcode shellcode.o 我认为错误是当我使用mov [ebx + x],al / eax /

  • 问题内容: 我遇到了错误… 命令由于信号失败:分段错误:11 …尝试编译我的Swift应用程序时。我正在使用Xcode 6.1,尝试在iOS 8.1上为iPhone 5进行构建。 我的密码 和错误文本! 问题答案: 对于遇到此问题的其他人…我发现问题是由导入自定义框架引起的,我不知道如何纠正它。但是,只需从框架中删除导入和任何引用项目的代码即可解决此问题。 (╯°□°)╯︵┻━┻ 希望这可以节省一

  • 问题内容: 我尝试使用输入四个浮点数,将它们存储到堆栈中,然后使用将它们复制到寄存器中以供使用。我的问题是,当我尝试输出这4个数字时,程序seg错误出现在。 我认为它与堆栈有关,但是我尝试多次弹出(一次执行多个指令)无济于事。我还是汇编语言的新手,所以使用它对于我来说有点太先进了。 您会注意到我包含了一个名为的文件。它使我能够查看寄存器和堆栈(这就是为什么要有指令的原因。)这是由我的教授提供的,它

  • 我正在尝试设置共享内存段以容纳字符串数组。例如,以下数组 string Example[]={“This is”,“An Example”,“of Strings”}; 然后,我尝试调用shmget,以便获得预留适当数量的os共享内存。 通读手册会指出shmget()返回一个“shmid”。同样,什么是shmid,是int、字符串、指针还是某种特殊类型,这是我标识共享内存段的方式吗?另外,如果sh