最初我有用户输入十进制数字(0 - 15),我会把它变成二进制数字。 假设这些数字被写入文本文件,如图所示。这些数字由1的数字排列。短划线 - 用于分隔不同的1组。
我必须阅读此文件,并将一个组的字符串与下面组中的所有字符串进行比较,即组1中包含组2中的所有字符串,组2组 - 组3。
这笔交易是,只允许一列0/1差异,并且该列被字母t替换。如果遇到多个差异列,则写入none。 所以说组2,0001与组3,0011,只有第二列是不同的。但是,0010和0101是两列差异。
结果将写入另一个文件.....
目前,当我读这些字符串时,我正在使用vector string 。我遇到了bitset。重要的是我必须一次访问一个角色,这意味着我已将向量 string 分解为向量 char 。但似乎可以更容易地做到这一点。
我甚至想过一个哈希表 - 链表。将组1分配给H [0]。每次比较都是H [current-group],H [current_group + 1]。但是,除了第一次比较(比较1和0)之外,超出此范围的比较在这种与哈希相关的方式下是行不通的。所以我放弃了。
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
#include <algorithm>
#include <iterator>
using namespace std;
int main() {
ifstream inFile("a.txt");
vector<string> svec;
copy(istream_iterator<string>(inFile), istream_iterator<string>(), back_inserter(svec));
copy(svec.begin(), svec.end(), ostream_iterator<string>(cout,"\n"));
for(int i = 0; i < svec.size(); i++)
{
cout << svec[i] << " ";
}
inFile.close();
return 0;
}
这是将其写入文件的示例代码....但就像我说的那样,在我的情况下,整个向量似乎都是不切实际的....
感谢任何帮助。感谢
答案 0 :(得分:1)
我不明白你的代码片段 - 看起来它所做的一切都是在输入文件中读入一个字符串向量,然后在单独的字符串中包含每个以空格分隔的单词,然后将其写回以两种不同的方式(一次用\n
分隔,一次用空格分隔。)
看起来您遇到的主要问题是阅读和解释文件本身,而不是进行必要的计算 - 对吧?这就是我希望这个答案可以帮助你。
我认为文件的行结构很重要 - 对吧?在这种情况下,最好使用global getline()
function in the <string>
header,它将整行(而不是以空格分隔的单词)读入字符串。 (不可否认,该功能非常隐蔽!)此外,您实际上并不需要将所有行读入矢量,然后处理它们 - 它更有效,实际上更容易将它们提取到数字或位集中:
vector<unsigned> last, curr; // An unsigned can comfortably hold 0-15
ifstream inf("a.txt");
while (true) {
string line;
getline(inf, line); // This is the group header: ignore it
while (getline(inf, line)) {
if (line == "-") {
break;
}
// This line contains a binary string: turn it into a number
// We ignore all characters that are not binary digits
unsigned val = 0;
for (int i = 0; i < line.size(); ++i) {
if (line[i] == '0' || line[i] == '1') {
val = (val << 1) + line[i] - '0';
}
}
curr.push_back(val);
}
// Either we reached EOF, or we saw a "-". Either way, compare
// the last 2 groups.
compare_them_somehow(curr, last); // Not doing everything for you ;)
last = curr; // Using swap() would be more efficient, but who cares
curr.clear();
if (inf) {
break; // Either the disk exploded, or we reached EOF, so we're done.
}
}
答案 1 :(得分:0)
也许我误解了你的目标,但字符串适合阵列成员比较:
string first = "001111";
string next = "110111";
int sizeFromTesting = 5;
int columnsOfDifference = 0;
for ( int UU = sizeFromTesting; UU >=0; UU-- )
{
if ( first[ UU ] != next[ UU ] )
columnsOfDifference++;
}
cout << columnsOfDifference;
cin.ignore( 99, '\n' );
return 0;
在适当情况下替换文件流和绑定保护。
不适用,但字面上逐位比较变量,&amp;两个数字都使用掩码(第二个数字为000010)。 如果或= 0,它们匹配:两者都是0.如果它们或= 1和&amp; = 1,两者的数字均为1。否则他们不同。重复所有位和组中的所有数字。
答案 2 :(得分:0)
在vb.net中
'group_0 with group_1
If (group_0_count > 0 AndAlso group_1_count > 0) Then
Dim result = ""
Dim index As Integer = 0
Dim g As Integer = 0
Dim h As Integer = 0
Dim i As Integer = 0
For g = 0 To group_0_count - 1
For h = 0 To group_1_count - 1
result = ""
index = 0
For i = 0 To 3
If group_1_0.Items(g).ToString.Chars(i) <> group_1_1.Items(h).ToString.Chars(i) Then
result &= "-"
index = index + 1
Else
result &= group_1_0.Items(g).ToString.Chars(i)
End If
Next
Next
Next
End If
答案 3 :(得分:0)
以整数形式读取它,然后您需要的是与位移和位掩码进行比较。