读取文件行并分割行中字符串:C/C++以及python实现

一、问题描述

 

给定一文件,依次读取文件中各行的字符串(字符串之间以空格分开)。

例如:文件test.txt中有如下内容:

first  second  third  forth  (第一行)

fifth  sixth seventh   (第二上)

… (其他行)

则读取的内容依次为:   first  second  third  forth   fifth  sixth seventh

 

二、解题步骤

 

(1)首先读取文件各行

(2)然后针对每行依次读取各个字符串

(3)最后将读取的字符串依次存入内存中

 

三、编程实现

 

1、C语言实现

在C语言中,有个函数:strtok() 用于分割字符串,其原型如下:

[cpp] 

  1. #include <string.h>
  2. char* strtok(char str[], const char* delim);

说明

 

I、参数:str为待分割的字符串;delim为分隔符字符串。

II、用法:该函数的使用比较奇特,若在str字符串中发现参数delim中的分割字符串之字符时,则会将该字符修改为‘\0’字符(字符串结束符)。在第一次调用时,strtok()必须给予参数str字符串,下次调用时则须将str设置成NULL。每次调用成功则返回指向被分割出片段的指针。

例子

 

[cpp] 

  1. #include <stdio.h>
  2. #include <string.h>
  3. int main()
  4. {
  5.     char s[] =”ab|cdef;ghi|jkl”;
  6.     char* delim = “|;”;
  7.     char* tmp;
  8.     tmp = strtok(s, delim);
  9.     while(tmp != NULL)
  10.     {
  11.         printf(“%s\n”,tmp);
  12.         tmp = strtok(NULL, delim);
  13.     }
  14.     return 0;
  15. }

输出

 

 

下面给出读文件各行中的字符串,并将其保存于内存中。设文件名为:test.txt,其内容如下:

对应的程序为:

 

[cpp]

  1. #include <stdio.h>
  2. #include <string.h>
  3. /*
  4. @in, str: 待分割的字符串
  5. @in, delim: 分隔符字符串
  6. @in_out, dest: 保存分割后的每个字符串,设为char**的引用,即表示可修改其值
  7. @out, pCount: 记录一行中分割所得字符串的个数
  8. */
  9. void split(char* str, char* delim, char** &dest, int* pCount)
  10. {
  11.     char* tmp;
  12.     *pCount=0;
  13.     if(NULL ==  str || 0 == strlen(str)) return ;
  14.     if(NULL == delim || 0 == strlen(delim)) return ;
  15.     tmp = strtok(str, delim);
  16.     while(tmp != NULL)
  17.     {
  18.         for(int j =0; tmp[j]!=’\0′;j++)
  19.         {
  20.             if(tmp[j]==’\n’)break; //到达行末
  21.             (*dest)[j] = tmp[j];
  22.         }
  23.         (*dest)[j]=’\0′;
  24.         dest++;
  25.         (*pCount)++;
  26.         tmp = strtok(NULL, delim);
  27.     }
  28. }
  29. int main()
  30. {
  31.     FILE* fp;
  32.     char lineBuf[129];
  33.     char* delim = ” “;  //分隔符为:空格
  34.     int num = 0;    //文件中总的字符串个数
  35.     int count = 0;  //一行中的字符串个数
  36.     int i;
  37.     /*申请内存用于存放字符串*/
  38.     char** dest  = new char*[128];
  39.     for( i = 0; i < 128; i++)
  40.     {
  41.         dest[i] = new char[64];
  42.     }
  43.     char** tmpDest = dest;
  44.     if(fp=fopen(“test.txt”, “r”))
  45.     {
  46.         while(fgets(lineBuf, 128, fp) != NULL)
  47.         {
  48.             split(lineBuf, delim, tmpDest, &count);
  49.             num  = num + count;
  50.         }
  51.     }
  52.     fclose(fp);
  53.     for(i= 0; i < num; i++)
  54.     {
  55.         printf(“%s\n”,dest[i]);
  56.     }
  57.     /*释放内存*/
  58.     for(i = 0; i<128;i++)
  59.     {
  60.         delete []dest[i];
  61.     }
  62.     delete[]dest;
  63.     return 0;
  64. }

 

2、C++语言实现

C++中没有实现split功能的函数,下面用C++ STL中的一些函数模拟实现split功能。

 

[cpp] 

  1. #include <iostream>
  2. #include <string>
  3. #include <vector>
  4. #include <fstream>
  5. using namespace std;
  6. /*
  7. @in, src: 待分割的字符串
  8. @in, delim: 分隔符字符串
  9. @in_out, dest: 保存分割后的每个字符串
  10. */
  11. void split(const string& src, const string& delim, vector<string>& dest)
  12. {
  13.     string str = src;
  14.     string::size_type start = 0, index;
  15.     string substr;
  16.     index = str.find_first_of(delim, start);    //在str中查找(起始:start) delim的任意字符的第一次出现的位置
  17.     while(index != string::npos)
  18.     {
  19.         substr = str.substr(start, index-start);
  20.         dest.push_back(substr);
  21.         start = str.find_first_not_of(delim, index);    //在str中查找(起始:index) 第一个不属于delim的字符出现的位置
  22.         if(start == string::npos) return;
  23.         index = str.find_first_of(delim, start);
  24.     }
  25. }
  26. int main()
  27. {
  28.     ifstream infile(“test.txt”, ios::in);
  29.     vector<string> results;
  30.     string word;
  31.     string delim(” “);
  32.     string textline;
  33.     if(infile.good())
  34.     {
  35.         while(!infile.fail())
  36.         {
  37.             getline(infile, textline);
  38.             split(textline, delim, results);
  39.         }
  40.     }
  41.     infile.close();
  42.     vector<string>::iterator iter = results.begin();
  43.     while(iter != results.end())
  44.     {
  45.         cout<<*iter++<<endl;
  46.     }
  47.     return 0;
  48. }

 

3、Python语言的实现

在Python中有专门的函数split()对字符串进行分割,实现较为简单

 

[python] 

  1. myfile = open(‘test.txt’, ‘r’)
  2. allWords = []
  3. line = myfile.readline()
  4. while line:
  5.     list = line.split(‘ ‘)
  6.     for word in list:
  7.         if word[-1]==’\n’:
  8.             allWords.append(word[:-1])  #去掉行末的’\n’
  9.         else:
  10.             allWords.append(word)
  11.     line = myfile.readline()
  12. myfile.close()
  13. print allWords

标签