私は次のようなものを読む必要があります:
_5 60 35 42
2 38 6
5 8
300 1500 900
_
そして、最初の行を配列に保存します。他の関数を呼び出した後、次の行で同じことを行います。
gets()
を試してから、sscanf()
を使用して文字列から整数をスキャンしますが、文字列からn個の数値を読み取る方法がわかりません。
私は以前、このような入力ファイルを競技会で見たことがあります。速度がエラー検出よりも問題である場合は、カスタムルーチンを使用できます。ここに私が使用するものと同様のものがあります:
void readintline(unsigned int* array, int* size) {
char buffer[101];
size=0;
char* in=buffer;
unsigned int* out=array;
fgets(buffer, 100, stdin);
do {
*out=0;
while(*in>='0') {
*out= *out* 10 + *in-'0';
++in;
}
if (*in)
++in; //skip whitespace
++out;
} while(*in);
size = out-array;
}
1行に100文字を超える場合、または配列が保持できる数を超える場合は、メモリが破壊されますが、unsigned intの行を読み取るための高速なルーチンは得られません。
一方、シンプルにしたい場合:
int main() {
std::string tmp;
while(std::getline(std::cin, tmp)) {
std::vector<int> nums;
std::stringstream ss(tmp);
int ti;
while(ss >> ti)
nums.Push_back(ti);
//do stuff with nums
}
return 0;
}
不明な数のエントリが不明な数の行に広がり、EOFで終了する場合:
int n;
while(cin >> n)
vector_of_int.Push_back(n);
不明な数の行にまたがる既知の数のエントリがある場合:
int n;
int number_of_entries = 20; // 20 for example, I don't know how many you have.
for(int i ; i < number_of_entries; ++i)
if(cin >> n)
vector_of_int.Push_back(n);
1行に不明な数のエントリがある場合:
std::string str;
std::getline(std::cin, str);
std::istringstream sstr(str);
int n;
while(sstr >> n)
vector_of_int.Push_back(n);
未知の数のエントリが既知の数の行にまたがっている場合:
for(int i = 0; i < number_of_lines; ++i) {
std::string str;
if(std::getline(std::cin, str)) {
std::istringstream sstr(str);
int n;
while(sstr >> n)
vector_of_int.Push_back(n);
}
}
私はおそらくこのようなコードを書くでしょう:
// Warning: untested code.
std::vector<int> read_line_ints(std::istream &is) {
std::string temp;
std::getline(is, temp);
std::istringstream buffer(temp);
int num;
std::vector<int> ret;
while (buffer>>num)
ret.Push_back(num);
return ret;
}
C++では、std::istringstream
を使用できます。
std::string nums = "1 20 300 4000";
std::istringstream stream(nums);
int a, b, c, d;
stream >> a >> b >> c >> d;
assert(a == 1 && b == 20 && c == 300 && d == 4000);
標準入力から取得したい場合は、同じことを行いますが、std::cin
を使用します
std::cin >> a >> b >> c >> d;
簡単な解決策は、それらを scanf()
で読み取ることです。
int array[1000];
int index = 0;
while ((index < 1000) && (scanf("%d", &tmp) == 1)) {
array[index++] = tmp;
}
これはまだ少し検証が必要です...
C++:
vector<int> ints;
while( !cin.eof() )
{
int t;
cin >> t;
if ( !cin.eof() )
ints.Push_back(t);
}
代替(Shahbazのthx)
int t;
vector<int> ints;
while(cin >> t)
ints.Push_back(t);
C++では、stdinを介して空白で区切られたN個の整数を読み取るのは非常に簡単です。
#include <iostream>
using namespace std;
const unsigned N = 5;
int main(void)
{
int nums[N];
for (unsigned i = 0; i < N; ++i)
cin >> nums[i];
cout << "Your numbers were:\n";
for (unsigned i = 0; i < N; ++i)
cout << nums[i] << " ";
cout << "\n";
return 0;
}