用C++; 我写了一个快速的C++程序,它要求用户输入一个文本文件和一个输出文本文件。然后,程序应该在文件的左边空白处对行进行编号。然而,我似乎无法让它正常工作,它编译得很好,但不像它应该的那样对行进行编号。我认为这是我的逻辑错误。我也不太熟悉C++中的文件I/O,因为我现在只是用旧的教科书学习它。

用C++; 我写了一个快速的C++程序,它要求用户输入一个文本文件和一个输出文本文件。然后,程序应该在文件的左边空白处对行进行编号。然而,我似乎无法让它正常工作,它编译得很好,但不像它应该的那样对行进行编号。我认为这是我的逻辑错误。我也不太熟悉C++中的文件I/O,因为我现在只是用旧的教科书学习它。,c++,file-io,iostream,fstream,C++,File Io,Iostream,Fstream,文件如下: #include <iostream> #include <fstream> #include <string> #include <cassert> #include <cstdio> using namespace std; int main(void) {int i = 0 , num = 1; string inputFileName; string outputFileName; string s; i

文件如下:

#include <iostream>
#include <fstream>
#include <string>
#include <cassert>
#include <cstdio>

using namespace std;

int main(void)
{int i = 0 , num = 1;
 string inputFileName;
 string outputFileName;
 string s;
 ifstream fileIn;
 ofstream fileOut;
 char ch;

 cout<<"Enter name of input file: ";
 cin>>inputFileName;
 cout<<"Enter name of output file: ";
 cin>>outputFileName;

 fileIn.open(inputFileName.data());
 fileOut.open(outputFileName.data());

 assert(fileIn.is_open() );
 assert(fileOut.is_open() );

 while (!(fileIn.eof()))
       {ch=fileIn.get();
        if (ch=='\n') num++;
           fileOut << num << "\n";
        s.insert(i,1,ch);     //insert character at position i
        i++;
       }
 fileOut << s;
 fileIn.close();
 fileOut.close();
 return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
内部主(空)
{int i=0,num=1;
字符串输入文件名;
字符串输出文件名;
字符串s;
ifstreamfilein;
流文件输出;
char ch;
coutinputFileName;
coutoutfilename;
fileIn.open(inputFileName.data());
打开(outputFileName.data());
断言(fileIn.is_open());
断言(fileOut.is_open());
而(!(fileIn.eof())
{ch=fileIn.get();
如果(ch=='\n')num++;
文件输出
inti=0;
弦线;
while(getline(infle,line))
{
输出文件
int i=0;
弦线;
while(getline(infle,line))
{

outfile不断言可能在非调试环境中合法失败的内容,例如文件未打开。在while循环中检查eof是错误的。请您向我解释为什么它是错误的,或者提供一个链接以便我学习。不要断言可能在非调试环境中合法失败的内容,例如文件未打开。检查while循环中的eof是错误的。你能给我解释一下为什么它是错误的,或者提供一个链接以便我学习吗?好的,那么我应该将while循环修改为这样的东西吗?是的,这是我将如何实现它的。比一次只获取一个字符要容易得多。@RemyLebeau为什么编辑我的答案使它变得更糟?文件流中的endl会使问题变得更严重它慢了。我现在同意我已经玩过了,你的方法比我用的好很多。非常感谢你!你能给我的任何其他建议都会很有帮助。@尼尔科克:我没有“使它更糟”。<代码>:STED::/Eng/<代码>是C++中结束一行的首选方法,而不是手工输出<代码> \\n“/Cord:>字符”。(这是C的做法)
std::endl
并不慢,它以适合平台的方式处理换行符的输出,它还允许流(如
of stream
)执行在遇到
std::endl
时刷新的缓冲。那么,我是否应该将while循环修改为类似的内容?是的,这就是我将如何实现它的方法。非常简单比一次只输入一个字符要好得多。@RemyLebeau你为什么编辑我的答案让它变得更糟?文件流中的endl会让它变得更慢。我同意,现在我已经使用了它,你的方法比我使用的方法好得多。非常感谢!你能给我的任何其他提示都会非常有用。@NeilKirk:我没有“使它更糟”。<代码> STD::EntL\/Cord>是在C++中结束一行的首选方法,而不是手动输出<代码> \\n“/COD>字符”(即C方式)。.
std::endl
并不慢,它以适合平台的方式处理输出换行符,它还允许流的
等流在遇到
std::endl
时执行刷新的缓冲。
int i = 0;
string line;
while (getline(infile, line))
{
    outfile << (i++) << " " << line << "\n";
}