注册 登录
编程论坛 C++教室

编译、链接、运行都没问题,但是就是达不到预期的结果!!!不知咋回事???

songhuirong1 发布于 2011-02-24 15:46, 461 次点击
题目是这样的:
给定一个要读取的文本文件,我们将计算文件的字节大小并将它存储在文件尾部。另外每次遇到一个换行符,我们都将当前的字节大小包括换行符存储在文件末尾。例如已知文本文件“copy.txt”的内容如下:
abcd
efg
hi
j
程序应该生成下面修改之后的文本文件
abcd
efg
hi
j
5 9 12 14 24

但是我编写了程序,程序的结果却是这样的:
abcd
efg
hi
j
12
不知咋回事!!!请各位高手帮忙看看。
程序源码如下:
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    fstream infile("copy.txt", ios_base::in | ios_base::app);
    int cnt = 0;
    char ch;
    infile.seekg(0);

    while(infile.get(ch))
    {
        cout.put(ch);
        ++cnt;

        if(ch == '\n')
        {
            streamoff mark = infile.tellg();
            infile << cnt << ' ';
            infile.seekg(mark);
        }
    }

    infile.clear();

    infile << cnt << endl;
    cout << "[" << cnt << "]" << endl;
   
    return 0;
}
5 回复
#2
pangding2011-02-24 16:12
一种比较简单的改法是像这样:
程序代码:

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

int main()
{
    ifstream infile("copy.txt");
    ofstream outfile("copy.txt", ios_base::app);

    int cnt = 0;
    char ch;
    infile.seekg(0);

    while(infile.get(ch))
    {
        cout.put(ch);
        ++cnt;

        if(ch == '\n')
        {
        outfile << cnt << ' ';
        }
    }

    outfile << cnt << endl;
    cout << "[" << cnt << "]" << endl;

 
    return 0;
}

#3
犬虫门心2011-02-24 16:19
请用cat命令查看一下你的copy文件,根本就没有写进去啊。再考虑一下文件的打开方式吧。
#4
犬虫门心2011-02-24 16:21
二楼的基本正确,就是多了一个数字,最后一个数字。
#5
pangding2011-02-24 16:23
看楼主的意思就是要多吧,倒数第二个是统计完最后一行时加的。最后一个是全文的计数。
不过我也没太看这个程序,总之程序的逻辑用的还是楼主的示例。我只是改了几个語句。
#6
songhuirong12011-02-25 13:58
我改正了。哈哈。只要加一条代码就ok了。
程序代码:
#include <iostream>
#include <fstream>
using namespace std;

int main()
{
    fstream inOut("copy.txt", ios_base::in | ios_base::app);
    int cnt = 0;
    char ch;

    inOut.seekg(0);

    while(inOut.get(ch))
    {
        cout.put(ch);
        ++cnt;

        if(ch == '\n')
        {
            streamoff markcur = inOut.tellg();
            inOut.seekg(-1, ios_base::end);
            inOut << cnt << ' ';
            inOut.seekg(markcur);
        }
    }

    inOut.clear();

    inOut << cnt << endl;
    cout << "[" << cnt << "]" << endl;
   
    return 0;
}

 
1