将tabify应用于我的文本文件会导致我的文件阅读器出现错误

时间:2015-09-08 07:01:07

标签: c++ tabs iostream fstream ifstream

我有一个文件records.txt,其中包含以下文字:

John    Smith   Sales   555-1234

Mary    Jones   Wages   555-9876

Paul    Harris  Accts   555-4321

我已将Mike McGrath的以下代码从 C ++编程复制到文件format.cpp中,以便读取records.txt中的数据:

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

int main()
{
  const int RANGE = 12;
  string tab[RANGE];
  int i = 0, j = 0;
  ifstream reader("records.txt");
  if (!reader)
    {
      cout << "Error opening input file" << endl;
      return -1;
    }
  while (!reader.eof())
    {
      if ((i + 1) % 4 == 0)
        getline(reader, tab[i++], '\n');
      else
        getline(reader, tab[i++], '\t');
    }
  reader.close();
  i = 0;
  while (i < RANGE)
    {
      cout << endl << "Record Number: " << ++j << endl;
      cout << "Forename: " << tab[i++] << endl;
      cout << "Surname: " << tab[i++] << endl;
      cout << "Daprtment: " << tab[i++] << endl;
      cout << "Telephone: " << tab[i++] << endl;
    }
  return 0;
}

现在,在我的.emacs文件中,我根据以下命令将标签自动转换为所有文件中的空格:

(setq-default indent-tabs-mode nil)

因此,当我编译并运行format.out时,我得到以下输出:

$ ./format.out 

Record Number: 1
Forename: John    Smith   Sales   555-1234
Mary    Jones   Wages   555-9876
Paul    Harris  Accts   555-4321

Surname: 
Daprtment: 
Telephone: 

Record Number: 2
Forename: 
Surname: 
Daprtment: 
Telephone: 

Record Number: 3
Forename: 
Surname: 
Daprtment: 
Telephone: 

这不是我想要的。我想要的是每个以制表符分隔的项目在其相应的标签后打印。

所以我进入emacs并输入以下命令将空格转换为records.txt中的标签:

M-x tabify

但是现在当我重新运行我的脚本时,我遇到了一个段错误:

$ ./format.out 
Segmentation fault (core dumped)

为什么会这样,我该怎么做才能修复它? (或者,如果一个原因不明显,我该怎样做才能进一步调查?)

我的c++代码中似乎存在问题,而不是文件本身,因为当我在records.txt中阅读python时,我发现它符合预期:

In [1]: with open('records.txt') as f:
   ...:     x = f.readlines()
   ...:     

In [2]: x
Out[2]: 
['John\tSmith\tSales\t555-1234\n',
 'Mary\tJones\tWages\t555-9876\n',
 'Paul\tHarris\tAccts\t555-4321\n']

1 个答案:

答案 0 :(得分:0)

您可以先阅读while (!reader.eof())错误的原因,Why is iostream::eof inside a loop condition considered wrong?。似乎你复制代码的书不是很好。

我希望这是你的seg错误的原因,因为你的eof检查不正确你在你的循环周围进行了太多次并且在你的阵列上进行了越界访问。你可以通过将数组的大小增加到13来检查这一点。

获得一本更好的书(顺便说一句是什么?)。

这是一种可能的方式来读取文件(未经测试的代码)

for (;;)
{
    char delim;
    if ((i + 1) % 4 == 0)
        delim = '\n';
    else
        delim = '\t';
    if (!getline(reader, tab[i++], delim))
        break; // eof or some other error
}