Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/164.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C+中的Linux分段错误+;-由于函数ifstream_C++_Linux - Fatal编程技术网

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

C++ C+中的Linux分段错误+;-由于函数ifstream,c++,linux,C++,Linux,我想我应该首先说,我刚刚在我的pc上安装了linux(debian),对在linux上做事没有任何先见之明。这个问题可能是由于一些非常简单的事情 本规范的相关部分与此类似: ifstream stockNames("names.txt"); while (!stockNames.eof()) { string snline; getline(stockNames,snline); cout << snline <

我想我应该首先说,我刚刚在我的pc上安装了linux(debian),对在linux上做事没有任何先见之明。这个问题可能是由于一些非常简单的事情

本规范的相关部分与此类似:

ifstream stockNames("names.txt");

    while (!stockNames.eof())
    {
        string snline;
        getline(stockNames,snline);
        cout << snline << endl;
        .
        .
        .
    }
ifstream stockNames(“names.txt”);
而(!stockNames.eof())
{
弦线;
getline(股票名称,snline);

cout首先,您的
while
循环是错误的,因为
eof
标志(或任何其他故障标志)是在尝试从流读取失败后设置的;这意味着,如果尝试使用
getline()读取失败
,循环不会立即退出,而是继续循环,这是代码中的一个严重错误

因此,以(惯用的方式)编写循环:


现在运行这个,看看它打印了什么。

首先,您的
while
循环是错误的,因为
eof
标志(或任何其他故障标志)是在尝试从流读取失败后设置的;这意味着,如果使用
getline()尝试读取失败
,循环不会立即退出,而是继续循环,这是代码中的一个严重错误

因此,以(惯用的方式)编写循环:


现在运行此命令,查看它打印的内容。

stockNames在尝试输入内容并接收到EOF字符之前,实际上不会显示为“文件结尾”。因此,您需要按如下方式重新编写循环:

ifstream stockNames("names.txt");

string snline;
getline(stockNames,snline);

while (!stockNames.eof())
{
    cout << snline << endl;
    .
    .
    .
    getline(stockNames,snline);
}
ifstream stockNames(“names.txt”);
弦线;
getline(股票名称,snline);
而(!stockNames.eof())
{

coutstockNames在尝试输入某些内容并收到EOF字符之前,实际上不会显示为“文件结尾”。因此,您需要按如下方式重新编写循环:

ifstream stockNames("names.txt");

string snline;
getline(stockNames,snline);

while (!stockNames.eof())
{
    cout << snline << endl;
    .
    .
    .
    getline(stockNames,snline);
}
ifstream stockNames(“names.txt”);
弦线;
getline(股票名称,snline);
而(!stockNames.eof())
{

无法回答您的问题;不,ifstream在Linux和Windows上的运行方式没有显著差异。当然,如果您编写有缺陷的代码(正如其他两个答案所指出的),那么您可能会遇到问题,但我看不出eof缺陷会如何导致您描述的问题


我将集中讨论您说使用snline会导致分段错误的部分,这表明存在更严重的问题。您是否可以发布代码来证明这一点?

来回答您的问题;不,ifstream在Linux和Windows上的运行方式没有显著差异。当然,如果您编写了有缺陷的代码(正如其他两个答案所指出的)那么您可能会遇到问题,但我看不出eof bug会如何导致您所描述的问题


我将集中讨论您说使用snline会导致分段错误的部分,这表明存在更严重的问题。您可以发布代码来证明这一点吗?

您没有检查流是否正确打开

std::ifstream stockNames("names.txt");
if (! stockNames) {
    std::cerr << "Unable to open file 'names.tex'\n";
}
else {
   // Do the rest of your stuff here.
}
std::ifstream stockNames(“names.txt”);
如果(!股票名称){

您没有检查流是否正确打开

std::ifstream stockNames("names.txt");
if (! stockNames) {
    std::cerr << "Unable to open file 'names.tex'\n";
}
else {
   // Do the rest of your stuff here.
}
std::ifstream stockNames(“names.txt”);
如果(!股票名称){

std::cerr您有一个dos文件,它在每行末尾使用\r\n。Linux无法识别\r作为行尾的一部分,因此它会包含在snline字符串中。\r导致打印的下一个内容出现在行首,因此“hey”会覆盖您希望看到的股票名称

试一试


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

试一试



我做了修改,但问题仍然存在。snline打印为空。@aristos:对不起,如果没有看到更多的代码和
names.txt
的内容,我就无法进一步帮助您。我已经添加了新代码,如果您做了修改,但问题仍然存在,您能看一下吗。snline打印为空。@aristos:Sorry、 如果没有看到更多的代码和
names.txt
的内容,我就忍不住要看更多的代码。我已经添加了新代码,如果您可以进行修改,您可以看一看吗,但问题仍然存在。snline打印为空。您能验证您是否真的提取了您认为是的文件吗?您确定它得到了names.txt吗?是的,如果你可以检查我在线程中所做的新更新,我已经添加了一行代码来检查文件是否成功打开。从我提到的更新中可以看出,有一些非常奇怪的事情。我已经做了修改,但问题仍然存在。snline打印为空。你能验证你是否真的在拾取你认为是正确的文件吗re?你确定它得到的是names.txt吗?是的,如果你能检查我在线程中所做的新更新,我已经添加了一行代码来检查文件是否成功打开。正如你在我提到的更新中所看到的,有一些非常奇怪的事情。我认为seg故障是由于输入snline为空。我已经编写了一个简单的代码来说明文件中的内容但是它不能正常工作,我确信它是由你的代码中的一个错误引起的,一个你在Windows而不是Linux上侥幸逃脱的错误。如果你发布一个完整的程序,我确信它很快就会被修复。在那之前它将是一个谜。@aristos用完整的代码编辑你的问题,请不要将我们链接到其他网站。我认为e seg故障是由于输入snline为空。我已经编写了一个简单的代码来显示文件名.txt中的内容,但它不能正常工作,我确信这是由您的代码中的一个错误引起的,一个您在Windows上侥幸逃脱的错误,但在Linux上没有。如果您发布一个完整的程序,我相信它很快就会得到修复。在那之前,它将是一个谜。@aristos ed信息技术
string snline;
while (getline(stockNames,snline))
{
    cout << snline;
    //..
}
//...
ifstream stockNames(dos.c_str() );
if (!stockNames) 
{
     cout << "file couldn't open properly" << endl;
     return 0;
}
string snline;
while (getline(stockNames,snline))
{
   cout << snline << " ";
}
ifstream stockNames("names.txt");

string snline;
getline(stockNames,snline);

while (!stockNames.eof())
{
    cout << snline << endl;
    .
    .
    .
    getline(stockNames,snline);
}
ifstream stockNames("names.txt");

string snline;
while (getline(stockNames, snline))
{
    cout << snline << endl;
    .
    .
    .
}
std::ifstream stockNames("names.txt");
if (! stockNames) {
    std::cerr << "Unable to open file 'names.tex'\n";
}
else {
   // Do the rest of your stuff here.
}
cout << snline << " " << endl;