如何正确使用ifstream从输入文件中读取数据?

时间:2016-06-12 01:05:55

标签: c++ objective-c class ifstream readfile

我已经就此问题进行了多次搜索。我只是回到编程,我正在尝试创建一个简单的代码,以便开始。

我目前正在使用g ++来编译我的文件。我正在使用gedit来输入我的代码和输入文件。

基本上我想从输入文件中读取数据(单独的整数列表),找到文本文件中的整数总数,然后将它们保存到数组中。

以下是我的主文件中使用的 HEADER 文件。

//Make program to read data from in_2.txt then add them and print to output file out_2.txt

#include <iostream>
#include <fstream>
#include <string.h>
#include <stdlib.h>
#include <iomanip>

std::ofstream outputfile("out_2.txt", std::ios::out);

class TEST_ADD{
    public:
        TEST_ADD(void); //constructor. Will use an unknown input file so nothing to do

        void INPUTREAD(char *); // Read the data from the input file. Ex.                       //b.INPUTREAD ("in.2")

        void ADD(void); //Will perform the actual summation and store value into int add


        void PRINT(void); // Print the numbers being summed, along with it's sum into out.2

    private:
        int add; //will store the sum of the numbers
        int n; //will keep track of total number of entries
        int A[20]; //used to store the number from the input file into an array

};

TEST_ADD::TEST_ADD (void)

{
    n=0;
}

void TEST_ADD::INPUTREAD (char * in_name) //will record the users input file (written in main.cpp)
                       //and store it as in_name

{
    int i;
    std::ifstream inputfile(in_name, std::ios::in);
    std::cout << "Number of n before input file read : "<< n << std::endl;

    inputfile >> n;

    /*while(!inputfile.eof()) 
    {
            inputfile >> n;
        //std::cout << std::setw(10) << n;
    }*/

    std::cout << "Number of n after input file read : " << n << std::endl;

    std::cout <<  "There are ("<< n << ") numbers in the input file" << std::endl; //check

    for(i=0;i<n;i++)
    {
        inputfile >> A[i];
        std::cout << "A[" << i << "] = " << A[i]<< std::endl;
    }

    outputfile << "There are ("<< n << ") numbers in the input file" << std::endl;


}

主要文件

#include <iostream>
#include <fstream>
#include <string.h>
#include <stdlib.h>
#include "Project2.h"

int main()
{
    TEST_ADD b;
    b.INPUTREAD("in_2.txt");

    return 0;
}

输入文件

1 
2
5
9

我认为这个问题是

inputfile >> n;

这是给别人的解决方案,这是我以前在课堂上使用的,但由于某种原因,文本文件没有正确读取所以我一定做错了。

当我使用以下内容时,我设置了一个cout语句来测试我的代码,这就是我得到的

jason@jason-Satellite-S55-B:~/C++/Second_program$ g++ main2.cpp -o project2
main2.cpp: In function ‘int main()’:
main2.cpp:10:24: warning: deprecated conversion from string constant to ‘char*’ [-Wwrite-strings]
  b.INPUTREAD("in_2.txt");
                        ^
jason@jason-Satellite-S55-B:~/C++/Second_program$ ./project2
Number of n before input file read : 0
Number of n after input file read : 1
There are (1) numbers in the input file
A[0] = 2

正如您所看到的那样只计算 1 条目,然后当我检查它在数组中存储的数字时,它会存储 2 这是第二个数字在文本文件中。它完全跳过了第一个条目。

如果您想知道,实际的out_2.txt文件有

There are (1) numbers in the input file

我也试过了这行

while(!inputfile.eof()) 
    {
            inputfile >> n;
        //std::cout << std::setw(10) << n;
    }

但是这只会带来其他问题,其中总计数 9 条目,并且存储在数组中的数字是大整数,这是不正确的。

感谢任何帮助。感谢

1 个答案:

答案 0 :(得分:1)

INPUTREAD函数采用char *参数。您正在传递“in_2.txt”,一个文字字符串。文字字符串是const char *,这是编译器的警告告诉你的。

  

正如您所看到的那样,只计入1个条目

文件中的第一个数字是1,所以

inputfile >> n;

将“1”读入n

  

然后当我检查它在数组中存储的数字时,它   存储2,它是文本文件中的第二个数字。

正确,这是文件中的下一个数字。在上面的语句读取“1”后,代码希望在文件中看到一个数字,然后开始读取。下一个,也就是代码读取的唯一数字是“2”,这就是你所看到的。

  

它完全跳过了第一个条目。

不,它没有。它是由

阅读的
inputfile >> n;

您需要添加

4

到文件的开头,表示后面跟着四个数字。代码读取文件中有多少个数字的计数,然后继续读取这些数字。这就是你编写程序的代码,而这正是它正在做的事情。