我有一堆基于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
答案 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;
}