目前我刚刚开始使用c ++并希望深入研究文件I / O,因此我搜索了一些随机代码并输入它以查看它是否有效以及它是如何工作的。但是我遇到了一些我自己无法理解的问题。
from sqlalchemy import *
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.declarative import declared_attr
Base = declarative_base()
class User(Base):
__tablename__ = 'user'
id = Column(Integer, primary_key=True)
email = Column(String(255))
class Employee(object):
name = Column(String(30))
@declared_attr
def user_id(cls):
return Column(Integer, ForeignKey('user.id'))
class Manager(Base, Employee):
__tablename__ = 'manager'
employee_id = Column(Integer, primary_key=True)
dept = Column(String(30))
__mapper_args__ = {'polymorphic_identity':'manager', 'concrete':True}
所以我有这个代码,我编译了它。它只会显示#include <fstream> //for file processing
#include <iostream>
#include <vector>
#include <string> //to_string
using namespace std;
int main ( int argc, char *argv[] )
{
if ( argc != 3 )
{
cerr << "Incorrect number of arguments" << endl;
return 1;
}
//open file at argv[1] ( should be our input file )
ifstream inputFile ( argv[1] );
ofstream outputFile ( argv[2] );
// check if file opening succeeded
if ( !inputFile.is_open() )
{
cerr << "Could not open the input file\n";
return 1;
}
else if( !outputFile.is_open() )
{
cerr << "Could not open the output file\n";
return 1;
}
//declare a vector of integers
vector<int> numbers;
int numberOfEntries;
//get the first value in the inputFile that has the number of elements in the file
inputFile >> numberOfEntries;
//iterate through the inputFile until there are no more numbers
for( int i = 0; i < numberOfEntries; ++i )
{
//get next number from inputFile
int number;
inputFile >> number;
//store number in the vector
numbers.push_back( number );
}
//iterate through the vector (need c++11)
for( int n : numbers )
{
//write to the output file with each number multiplied by 5
outputFile << (n*5);
//add a line to the end so the file is readable
outputFile << "\n";
}
return 0;
}
。出了什么问题?
答案 0 :(得分:3)
Spidey是正确的,但是,重要的是,当你开始这样的编程时,你会通读代码并将其分解为你能理解的部分。
#include <fstream> //for file processing
#include <iostream>
#include <vector>
#include <string> //to_string
using namespace std;
您应该将这些视为包含指令 - 使用与I / O相关的库,就像您期望的那样。
int main ( int argc, char *argv[] )
{
if ( argc != 3 )
{
cerr << "Incorrect number of arguments" << endl;
return 1;
}
这是抛出错误的地方。 argc
正在检查向应用程序提供了多少个参数 - 如果该数字不是3
,程序将返回一条消息,并以1
的结果退出 - 成功程序总是通过比较返回0
。
我们可以通过分析接下来的几行来仔细检查这个假设:
//open file at argv[1] ( should be our input file )
ifstream inputFile ( argv[1] );
ofstream outputFile ( argv[2] );
请参阅?它正在检查在参数位置[1]
和[2]
处提供的文件 - 我们的初始假设是正确的。该程序需要在命令行提供多个文件;没有它们就无法运行。因此程序在意识到它没有正确数量的文件时就会提前退出。
// check if file opening succeeded
if ( !inputFile.is_open() )
{
cerr << "Could not open the input file\n";
return 1;
}
else if( !outputFile.is_open() )
{
cerr << "Could not open the output file\n";
return 1;
}
这些行将尝试打开文件,并返回错误消息并在无法打开时提前退出(例如,如果它们不存在)。
//declare a vector of integers
vector<int> numbers;
int numberOfEntries;
//get the first value in the inputFile that has the number of elements in the file
inputFile >> numberOfEntries;
//iterate through the inputFile until there are no more numbers
for( int i = 0; i < numberOfEntries; ++i )
{
//get next number from inputFile
int number;
inputFile >> number;
//store number in the vector
numbers.push_back( number );
}
//iterate through the vector (need c++11)
for( int n : numbers )
{
//write to the output file with each number multiplied by 5
outputFile << (n*5);
//add a line to the end so the file is readable
outputFile << "\n";
}
此代码循环遍历inputFile
,查找数字,并将其输出到outputFile
。
所以现在我们知道整个程序是从文件中读取数字并写入另一个文件的练习。这是一个简单的I / O示例。
return 0;
还记得当我说一个成功的程序返回0
时?好吧,在运行完所有代码之后,程序就完全正确了。
编辑:要直接回答您的问题,此程序需要提供两个文件作为文件名。这样的示例是g++ -o fileExample fileExample.cpp input.txt output.txt
,其中input.txt
文件包含数字行,并创建output.txt
,与input.txt
和fileExample.cpp
位于同一位置。/etc/grub.d
}。
答案 1 :(得分:0)
您尚未指定正确数量的参数。发布您在编译之前输入的内容。 (编辑:我所说的关于该程序的实际功能是错误的,我浏览了大声笑,上面的老兄总结得更好)。