为什么从文件中获取输入时我的字符串为空?
Why is my string empty when taking input from file?
我有一个充满数字(20 亿)的巨大文件。所以这是一个文件拆分器,它将我的文件拆分为 100000 个数字的组。但这是返回充满空格和输入的空文件。我什至试图改变变量的数据类型。我很震惊。请提出建议。
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <fstream>
#include <algorithm>
using namespace std;
int main()
{
std::ifstream ifs("prime.txt");
unsigned long long int curr;
unsigned long long int x = 0;
string li;
int count;
while (getline(ifs, li))
{
count ++;
}
ifs.seekg(ios::beg);
string v;
while (curr < count)
{
x++;
std::string file = to_string(x) ;
std::string filename = "splitted\"+file+ ".txt";
std::ofstream ofile (filename.c_str());
while (curr < 100000*x )
{
ifs >> v ;
ofile << v << "\n";
curr++;
}
ofile.close();
}
}
你有 2 个未初始化的变量,count
和 curr
,你的编译器应该警告你这些。如果它不能确保您已启用编译器警告。
在初始 while 循环中的最后一个 getline
失败后,流将设置 fail
和 eof
标志。由于流不处于 good
状态,对其的所有进一步操作都将失败,因此您的 seekg
将被忽略,您的所有读取也将被忽略。要在 seekg
.
之前修复此调用 ifs.clear();
因为你似乎不需要任何地方的行数,所以预先计算它是不必要的,因为你不是按行读取文件,如果你的文件在一个文件上有多个值,它将导致不正确的行为线。您的代码可以简化为:
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <fstream>
#include <algorithm>
using namespace std;
int main()
{
std::ifstream ifs("prime.txt");
if (!ifs)
{
std::cout << "error opening input file\n";
return 1;
}
int64_t fileNumber = 0;
int64_t fileCount = 0;
std::ofstream ofile;
while (ifs)
{
if (!ofile.is_open() || (fileCount >= 100000))
{
ofile.close();
fileCount = 0;
fileNumber++;
std::string file = to_string(fileNumber);
std::string filename = "splitted\" + file + ".txt";
ofile.open(filename.c_str());
if (!ofile)
{
std::cout << "error opening output file\n";
return 1;
}
}
std::string value;
if (ifs >> value) {
ofile << value << "\n";
fileCount++;
}
}
}
我有一个充满数字(20 亿)的巨大文件。所以这是一个文件拆分器,它将我的文件拆分为 100000 个数字的组。但这是返回充满空格和输入的空文件。我什至试图改变变量的数据类型。我很震惊。请提出建议。
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <fstream>
#include <algorithm>
using namespace std;
int main()
{
std::ifstream ifs("prime.txt");
unsigned long long int curr;
unsigned long long int x = 0;
string li;
int count;
while (getline(ifs, li))
{
count ++;
}
ifs.seekg(ios::beg);
string v;
while (curr < count)
{
x++;
std::string file = to_string(x) ;
std::string filename = "splitted\"+file+ ".txt";
std::ofstream ofile (filename.c_str());
while (curr < 100000*x )
{
ifs >> v ;
ofile << v << "\n";
curr++;
}
ofile.close();
}
}
你有 2 个未初始化的变量,count
和 curr
,你的编译器应该警告你这些。如果它不能确保您已启用编译器警告。
在初始 while 循环中的最后一个 getline
失败后,流将设置 fail
和 eof
标志。由于流不处于 good
状态,对其的所有进一步操作都将失败,因此您的 seekg
将被忽略,您的所有读取也将被忽略。要在 seekg
.
ifs.clear();
因为你似乎不需要任何地方的行数,所以预先计算它是不必要的,因为你不是按行读取文件,如果你的文件在一个文件上有多个值,它将导致不正确的行为线。您的代码可以简化为:
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
#include <fstream>
#include <algorithm>
using namespace std;
int main()
{
std::ifstream ifs("prime.txt");
if (!ifs)
{
std::cout << "error opening input file\n";
return 1;
}
int64_t fileNumber = 0;
int64_t fileCount = 0;
std::ofstream ofile;
while (ifs)
{
if (!ofile.is_open() || (fileCount >= 100000))
{
ofile.close();
fileCount = 0;
fileNumber++;
std::string file = to_string(fileNumber);
std::string filename = "splitted\" + file + ".txt";
ofile.open(filename.c_str());
if (!ofile)
{
std::cout << "error opening output file\n";
return 1;
}
}
std::string value;
if (ifs >> value) {
ofile << value << "\n";
fileCount++;
}
}
}