C++实现input.txt内容逐行定时复制到剪贴板遇问题求助
Alright, let's get this sorted out. You've already nailed reading the file into a vector and copying user input to the clipboard—great start! The problem with looping through your vector elements likely comes from either not reusing your clipboard logic correctly, or missing some platform-specific steps when updating the clipboard repeatedly.
First, let's wrap your clipboard functionality into a reusable function so you can call it for both user input and vector elements. Here's a platform-specific example for Windows (since clipboard operations are OS-dependent; I'll note Linux/macOS tweaks at the end):
#include <iostream> #include <vector> #include <string> #include <fstream> #include <windows.h> // For Windows clipboard functions #include <chrono> #include <thread> // Helper function to copy a std::string to Windows clipboard bool copyToClipboard(const std::string& text) { // Open the clipboard if (!OpenClipboard(nullptr)) { std::cerr << "Failed to open clipboard\n"; return false; } // Empty the clipboard first to ensure clean state EmptyClipboard(); // Convert std::string to wide string (required for Windows Unicode clipboard) int wideSize = MultiByteToWideChar(CP_UTF8, 0, text.c_str(), -1, nullptr, 0); wchar_t* wideText = static_cast<wchar_t*>(GlobalAlloc(GMEM_MOVEABLE, wideSize * sizeof(wchar_t))); MultiByteToWideChar(CP_UTF8, 0, text.c_str(), -1, wideText, wideSize); // Set the clipboard data SetClipboardData(CF_UNICODETEXT, wideText); // Close the clipboard (this releases the allocated global memory automatically) CloseClipboard(); return true; } // Your existing file reading function (assuming it works correctly) void getFileContent(std::string fileName, std::vector<std::string>& vecOfStrs) { std::ifstream file(fileName); if (!file.is_open()) { std::cerr << "Could not open file: " << fileName << "\n"; return; } std::string line; while (std::getline(file, line)) { vecOfStrs.push_back(line); } file.close(); } int main() { std::vector<std::string> lines; getFileContent("input.txt", lines); if (lines.empty()) { std::cerr << "No lines loaded from input.txt\n"; return 1; } std::cout << "Starting clipboard loop. Press Ctrl+C to stop.\n"; for (const auto& line : lines) { std::cout << "Copying line: " << line << "\n"; if (copyToClipboard(line)) { std::cout << "Successfully copied to clipboard\n"; } else { std::cerr << "Failed to copy line to clipboard\n"; } // Wait 1 second before next copy (portable C++11+ delay) std::this_thread::sleep_for(std::chrono::seconds(1)); } return 0; }
Key Fixes & Notes:
- Reusable Clipboard Function: By wrapping the clipboard logic into
copyToClipboard, you avoid repeating code and ensure consistency whether you're copying user input or vector elements. - Windows Clipboard Requirements: Windows uses wide strings (
wchar_t) for Unicode text, so we convert thestd::stringto a wide string usingMultiByteToWideChar. We also properly manage global memory for clipboard data—closing the clipboard releases this memory automatically. - Portable Delay: Using
std::this_thread::sleep_for(C++11+) works across platforms, unlike OS-specific functions likeSleep()(Windows) orsleep()(Linux). - Error Handling: Added checks for clipboard access, file opening, and empty vectors to help debug issues quickly.
For Linux/macOS:
If you're on a Unix-like system, replace the Windows clipboard code with a platform-specific alternative. For Linux, you can use xclip via system calls:
bool copyToClipboard(const std::string& text) { // Pipe text to xclip to copy to system clipboard FILE* pipe = popen("xclip -selection clipboard", "w"); if (!pipe) { std::cerr << "Failed to open pipe to xclip\n"; return false; } fwrite(text.c_str(), 1, text.size(), pipe); pclose(pipe); return true; }
Make sure xclip is installed (sudo apt install xclip on Debian/Ubuntu).
Give this code a try—your vector elements should now copy to the clipboard one by one with a 1-second delay between each. If you still run into issues, double-check that your getFileContent function is reading all lines correctly (no missing data or empty lines) and that you have clipboard access permissions.
内容的提问来源于stack exchange,提问作者MALKAVIAN

