none
C++的ifstream流读取txt文件定位下一行的问题 RRS feed

  • 问题

  • 使用C++的ifstream流读取txt文件,txt文件中的每一行的数据个数是不一样的,怎么样实现读取数据文件的中的固定个数的数据呢?比如我需要读取每一行的第5到200个数据,每行的数据肯定是大于200个的,该怎么样实现定位到下一行数据中呢?谢谢。seekg函数可以定位,但是我不知道怎么定位到下一行中。
    2010年12月22日 11:02

答案

  • Hi pucx,

    您可以把之前的while循环语句改成如下:

    while(!ifs.eof()&&!ifs.fail())

      {

        getline(ifs, str);

        const size_t newsize = 100;

        char nstring[newsize];

        strcpy_s(nstring, str.c_str());

          

           int count=1;

           int i=0;

           int j[300];

           int k=0;

           for(i=0;i<29;i++)

           {

                  if(nstring[i]==' ')

                  {

                         count++;

                         j[k]=i;//把空格的位置存在j数组里

                         k++;

                  }

           }

           for(count=48;count<=178;count++) //读取每行数据的第50个到第180个数据

           {

                  for( i=j[count]+1;i<j[count+1];i++)//输出两个空格之间的值

                  {

                         cout<<nstring[i];

                  }

                  cout<<" ";

           }

               cout<<endl;

      }

    我们这里只能提供一个思路,您可以根据这个思路,按照自己的需求写相应的代码。

    >>那可不可以用CFile文件方法实现呢?、

    可以CFile文件方法实现.

    File I/O Functions http://msdn.microsoft.com/en-us/library/aa916914.aspx

     

    请把有用的回答标记为答案。

    谢谢,

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2010年12月29日 9:33
    版主

全部回复

  • getline行么
    麻烦把正确答案设为解答。
    2010年12月23日 2:21
    版主
  • getline()函数怎么读取从指定的第几个数据到第几个数据的数据呢????
    2010年12月24日 3:18
  • Hi pucx,

    我们可以通过getline获取每行的数据放到string类型的字符串中。

    再把string类型转成char *类型。

    最后,通过一个循环语句就可以读取字符数组指定位置指定大小的数据了。

    以下是具体步骤:

    1.创建一个win32 的控制台程序;

    2.输入以下代码:

    #include "stdafx.h"
    #include <fstream>
    #include <iostream>
    #include <string>
    #include <sstream>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
      ifstream ifs("C:\\Users\\v-lucli\\Desktop\\hs.txt");
      if(!ifs)
      {
        cout<<"can not open file";
        return -1;
      }
      string str;
      while(!ifs.eof()&&!ifs.fail())
      {
        getline(ifs, str);
        const size_t newsize = 100;
        char nstring[newsize];
        strcpy_s(nstring, str.c_str());
        for(int i=2;i<5;i++)
        {
           cout<<nstring[i];
        }
        cout<<endl;
      }
      return 0;
    }
    

     

    谢谢,

    Luxy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2010年12月24日 4:47
    版主
  • Hi Lucy-Liu
    你的程序如果说数据是
    23456
    563246
    4567892
    34564
    567890
    这样的数据的话还行,但是如果说数据是以下的情况呢?
    2 3 4 5 6
    5 6 3 2 4 6
    4 5 6 7 8 9 2
    3 4 5 6 4
    5 6 7 8 9 0
    ...
    还有这样的数据文件情况呢?
    2 333 4 54 6
    5 6 311 2 4 6
    4 5 62 7 8334 9 2
    3 42 5 6 422
    52 6 7 8 922 20
    ...
    这样的情况就不行的啊?我需要的是能够读取后面两种情况的。
    还请指教。谢谢!
    2010年12月24日 16:08
  • 你这个需求没有特别好的方法

    要么全都读上来自己分析

    一个字符一个字符的读取检测

    因为文本文件记录长度不定

    不支持一步定位

    2010年12月25日 7:23
  • 但是如果我的数据文件每列的数据个数一样呢?如下面的情况: 22 33 456 444 233 4 5 5... 34 45 56 67 34 53 3 4... 35 45 3 3 43 4 5 6... 45 5 6 67 5 3 5 9... ... 每行固定有250个数据,行数不定 现在我要求读取每行数据的第50到第180个数据,那这样有没有好的方法呢?谢谢!
    2010年12月25日 16:29
  • 个数一样没有用

    比如都是三个数1 2 3和587 5999 5555

    这差很多的

    对于这种文本必须进行解析

    别无他法

    2010年12月27日 2:29
  • 那样就只有把所有的文本全部读取完之后处理了。。。那可不可以用C的File文件方法实现呢?
    2010年12月27日 15:51
  • Hi pucx,

    您可以把之前的while循环语句改成如下:

    while(!ifs.eof()&&!ifs.fail())

      {

        getline(ifs, str);

        const size_t newsize = 100;

        char nstring[newsize];

        strcpy_s(nstring, str.c_str());

          

           int count=1;

           int i=0;

           int j[300];

           int k=0;

           for(i=0;i<29;i++)

           {

                  if(nstring[i]==' ')

                  {

                         count++;

                         j[k]=i;//把空格的位置存在j数组里

                         k++;

                  }

           }

           for(count=48;count<=178;count++) //读取每行数据的第50个到第180个数据

           {

                  for( i=j[count]+1;i<j[count+1];i++)//输出两个空格之间的值

                  {

                         cout<<nstring[i];

                  }

                  cout<<" ";

           }

               cout<<endl;

      }

    我们这里只能提供一个思路,您可以根据这个思路,按照自己的需求写相应的代码。

    >>那可不可以用CFile文件方法实现呢?、

    可以CFile文件方法实现.

    File I/O Functions http://msdn.microsoft.com/en-us/library/aa916914.aspx

     

    请把有用的回答标记为答案。

    谢谢,

    Lucy


    Lucy Liu [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2010年12月29日 9:33
    版主