使用C ++读取各种长度的多个文本字符串

时间:2014-11-20 17:57:35

标签: c++ char

我有一堆基于ASCII的文本文件,用作各种计算机程序的输入文件,我需要将它们转换为不同的格式。每个输入文件以4位数字开头,如果前四位数字以0(数字零)开头,则后面跟着另外的输入数据或注释行。我正在开发一个基于C ++的文件转换器,我希望它读取四位数字,如果该数字是跟随它的注释行中的零读数。下面提供一个例子。 C ++可以很容易地将数字读入数组或使用std :: vector;但是读取字符串会变得复杂得多。首先,如果每个注释行具有相同数量的单词,我可以将每个字符串视为在固定列中填充其自己的行,但由于每个注释行具有不同数量的单词,因此列数为在每一行读入都会有所不同。是否有一种简单的方法可以在注释行中读取C ++不会将每个单词之间的空格视为一列数据的结尾和另一列的开头?通用数字和数据在下面的文件示例中使用,但希望您可以看到以数字0开头的注释行跟随它们的单词数量不同,从而无法将数据作为严格的数据列读取。

0001 Input File Name
0001 - Description of input file goes here
0001 - PROGRAM name that works on this data
0000 ==========================================
0001 List of references used in the development of this input file
0001 [1] Ref. 1
0001 [2] Ref. 2
0001 [3] Ref. 3
1100 Input line 1:       CBRD 1-0220
1101 Core Length (mm):   8.189
1102 Core diameter (mm): 37.81

2 个答案:

答案 0 :(得分:2)

使用getline函数从文件中读取一行到字符串,然后处理该字符串以执行任何操作。

类似于:while(getline(file,string)){...}

您不需要知道每行的最大字符数。 这就是我的意思:

 int main() {
      std::fstream iFile("Input.txt", std::fstream::in);
      //You might want to check if it is open
      std::string line;

      int firstNumber;
      std::string word;
      while(getline(iFile, line)){
        std::stringstream lineStream(line);

        lineStream >> firstNumber;
        if(firstNumber == 0) { // modify based on what you want to do
          while(lineStream >> word) {
            std::cout << word << " ";
          }
        }
      }
      std::cout << std::endl;
      iFile.close();
    }

答案 1 :(得分:0)

根据上面提供的建议,我能够实施以下解决方案。我会尝试清理它并使其更通用,以便它可以很容易地应用于其他问题。我很感激它给我的建议和帮助。

#include <iostream>
#include <fstream>
#include <cstring>
#include <stdio.h>

int main(int argc, const char * argv[]) {

    std::string Input_File("Input.txt");
    std::string comment;
    const int MAX_CHARS_PER_LINE = 1200;
    const int MAX_TOKENS_PER_LINE = 40;
    const char* const DELIMITER = " ";
    FILE *Output_File;

    std::ifstream inp(Input_File, std::ios::in | std::ios::binary);
    if(!inp) {
        std::cout << "Cannot Open " << Input_File << std::endl;
        return 1; // Terminate program
    }

    Output_File = fopen ("Output_File.txt","w");
    std::ofstream out("Output_File.txt", std::ios::in | std::ios::binary);

    // read each line of the file
    while (!inp.eof())
    {
        // read an entire line into memory
        char buf[MAX_CHARS_PER_LINE];
        inp.getline(buf, MAX_CHARS_PER_LINE);

        // parse the line into blank-delimited tokens
        int n = 0; // a for-loop index

        // array to store memory addresses of the tokens in buf
        const char* token[MAX_TOKENS_PER_LINE] = {}; // initialize to 0

        // parse the line
        token[0] = strtok(buf, DELIMITER); // first token
        if (token[0]) // zero if line is blank
        {
            for (n = 1; n < MAX_TOKENS_PER_LINE; n++)
            {
                token[n] = strtok(0, DELIMITER); // subsequent tokens
                if (!token[n]) break; // no more tokens
            }
            if (strncmp (token[0],"0",1) == 0)
            {
                for(int i = 0; i < n; i++) out << token[i] << " ";
            }
            out << std::endl;
        }
    }
    inp.close();

    return 0;
}