在c ++中如何读取矩形的文件x,y坐标?

时间:2013-12-12 22:35:39

标签: c++

数据格式为:

0,0    2,0    2,4    0,4 (there are tabs in between each pair)  
5,5    7,5    7,9    0,9

它们是文本文件的前两行,每行代表一个三角形。

#include <iostream>
#include <fstream>
using namespace std;
int main()
{
    int x1, x2, x3, x4, y1, y2, y3, y4;
    string coordinates;
    ifstream myfile;
    myfile.open("coordinates.txt");
    string line = myfile.getline();
    myfile>>x1>>y1>>x2>>y2>>x3>>y3>>x4>>y4;
    cout << line;
}

我尝试了几种方法将数据输入相关的整数,但没有运气。有人可以帮忙吗?

5 个答案:

答案 0 :(得分:1)

坦率地说,C ++的流输入机制非常令人讨厌。如果您能够使用最新版本的C ++,则可以考虑使用正则表达式。使用getline从流中获取该行,然后在每行上使用regex表达式,例如^(?:(\d+),(\d+)\t){3}(\d+),(\d+)$

如果失败了,也可以使用sscanf,虽然它不像你想要的那样是C ++,但它比相应的流操作IMO更容易理解。

答案 1 :(得分:0)

您可以使用operator >>

myfile >> x1;

请注意,您应该包含<fstream>

答案 2 :(得分:0)

  

我已经添加了<fstream>并使用了>>运算符,但我不知道如何处理标签和逗号以及行之间的返回。

问题不在于制表符或换行符(因为它们被流视为空格,它们作为对格式化I / O的传统操作的一部分被提取和丢弃)。问题在于逗号,因为它们提取。例如,如果在上次提取到in >> x >> y之后流中存在非数字字符,则y执行操作会使x保持未初始化状态。

首次提取整数后,您需要一种方法来提取逗号。最简单的技术是使用虚拟char变量提取到:

int x1, y1;
char dummy;

if (myfile >> x1 >> dummy >> y1)
{
    // ...
}

答案 3 :(得分:0)

我必须写一个简短的程序,也许你可以使用其中一些:

#include <iostream>
#include <fstream>
#include <iomanip>
using namespace std;

int main()
{
  ifstream inFile;
  float num1, num2, num3, num4, num5, sum, avg;


  cout << "Reading data from the Z:CLM1.dat file:\n\n";

  // Open the file.
  inFile.open("Z:\\CLM1.dat");

  // Read the five numbers from the file.
  inFile >> num1;
  inFile >> num2;
  inFile >> num3;
  inFile >> num4;
  inFile >> num5;

  // Close the file.
  inFile.close();

  // Calculate the sum of the numbers.
  sum = num1 + num2 + num3 + num4 + num5;
  avg = sum / 5;

  // Display the five numbers.
  cout << setprecision(3) << fixed << "Number 1 is " << num1 << "\n"
       << "Number 2 is " << num2 << "\n"
       << "Number 3 is " << num3 << "\n"
       << "Number 4 is " << num4 << "\n"
       << "Number 5 is " << num5 << "\n"
       << endl;

  // Display the sum of the numbers.
  cout << "The sum of the 5 numbers is: " << sum << endl;
  cout << "The average of these 5 numbers is: " << avg << endl;
  getchar();
  return 0;
} 

答案 4 :(得分:0)

您说您希望将数据读入单个整数,但是您要将整个第一行读入字符串然后再显示它。

如果要从文本文件中读取整数,这些整数由空格字符(空格,制表符或换行符)分隔,则运算符&gt;&gt;就是你所需要的:

#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

int main()
{
    // Read in the entire file to a string
    string fileContents;

    ifstream fin;
    fin.open("myfile.txt");
    if(fin.is_open())
    {
        getline(fin,fileContents,'\x1A');
        fin.close();
    }

    // Use the string to init an istringstream from which you can read
    istringstream iss(fileContents);

    // Read from the file contents
    int x,y,z;

    iss >> x;
    iss >> y;
    iss >> z;

    // Display the integers
    cout << x << ' ' << y << ' ' << z << '\n';

    return 0;
}

请注意,我首先使用stringstream将文件的全部内容读入内存,然后从该流中读取。这是一个可选步骤,我这样做只是因为我更喜欢在对内容进行任何额外工作之前尽快打开和关闭文件的习惯。如果文件非常大,这可能不太理想。您可以使用相同的运算符&gt;&gt;在打开和关闭文件的位置之间使用ifstream对象,并完全省略stringstream,如下所示:

int main()
{
    int x,y,z;

    // Open the file
    ifstream fin;
    fin.open("myfile.txt");
    if(fin.is_open())
    {
        // Read from the file contents
        fin >> x;
        fin >> y;
        fin >> z;

        fin.close();
    }

    // Display the integers
    cout << x << ' ' << y << ' ' << z << '\n';

    return 0;
}

另请注意,没有验证可确保您不会尝试阅读文件末尾,您正在阅读的内容实际上是整数,您只是阅读为此,我建议您先阅读一些简单的输入验证教程。