QTextStream을 사용하여 간단한 CSV 데이터 내보내기를 작성했지만 중복 된 쉼표가 각 행의 끝에 나타납니다. QTextStream에서 마지막으로 기록 된 심볼을 삭제하고 삭제 한 후에 데이터를 계속 쓰려면 어떻게해야합니까?QTextStream에 백 스페이스를 "쓰는"방법은 무엇입니까?
0
A
답변
1
짧은 대답은 당신이 할 수 없다는 것입니다. 그것은 스트림입니다 (당신이하고 싶지 않은 어떤 버퍼 조작없이). 문자를 삭제하는 것과 같은 것은 없습니다. 이미 "다운 스트림"으로 보내졌습니다 (터미널을 생각하십시오).
원래 파일에서 중복 된 쉼표를 삭제하거나 출력 스트림에 쓰기 전에 쉼표를 제거하고 줄 단위로 CSV를 읽을 수 있습니다. 여전히 QTextStream을 입력 스트림으로 사용하여 한 줄씩 읽을 수 있지만 출력 스트림에 전달하기 전에 쉼표를 직접 제거해야합니다.
1
스트림 작업 "unwrite"가 없으므로 쉼표를 직접 제거 할 수 없습니다. 은이어야합니다. 작성하지 않도록하십시오.
struct QStreamJoiner
{
QTextStream & ts;
bool doComma = false;
template<typename T>
QStreamJoiner & operator<<(const T & value)
{
if (doComma++) ts << ',';
ts << value;
return *this;
}
}
당신은 각 라인, 예를 들어, 귀하의 QTextStream
주위 QStreamJoiner
같은 래퍼를 사용할 수 있습니다
QTextStream out = ...;
for (auto record : records)
{
QStreamJoiner joiner(out);
joiner << record.field1;
if (condition) joiner << record.field2;
...
}
이것은 XY 문제와 같습니다. 문자가 스트림에 기록되면 문자를 지우는 방법은 없습니다. 루프에 조건을 추가하여 쉼표가 기록되지 않도록 마지막 열이나 유사한 검사를 확인해야합니다. – iksemyonov
일부 필드는 조건부로 쓰여지고 다음 필드가 쓰여지는지 여부를 알 수 없으므로 구분 기호를 쓰는지 여부를 알 수 없습니다. –
필드 앞에 쉼표를 쓸 수 있습니까? 그래서 스트림 << ","<< nextfield; 그렇다면 필드가 첫 번째 필드인지 여부를 알아야합니다. – FloIsAwsm