我有一个文件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']
答案 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
}