C++ fstream读取正常但不写入用户输入字符串的问题

C++ fstream读取正常但不写入用户输入字符串的问题,c++,fstream,C++,Fstream,我在代码中找不到问题readFile函数运行良好,但writeFile函数不会对文件进行任何更改: #include <iostream> #include <fstream> using namespace std; const int BUF_SIZE = 1024; void readFile(fstream &file, char buffer[BUF_SIZE]); void writeFile(fstream &file); void r

我在代码中找不到问题
readFile
函数运行良好,但
writeFile
函数不会对文件进行任何更改:

#include <iostream>
#include <fstream>

using namespace std;
const int BUF_SIZE = 1024;

void readFile(fstream &file, char buffer[BUF_SIZE]);
void writeFile(fstream &file);

void readFile(fstream &file, char buffer[BUF_SIZE])
{
    int position;
    cout << "Please enter a position to read from the file some info" << endl;
    cin >> position;
    file.seekg(position, ios::beg);
    file.read((char*) buffer, BUF_SIZE); // <<<<<

    for(int i = 0; i < file.gcount(); i++){
        cout << buffer[i];
    }
}

void writeFile(fstream &file)
{
    char temp[100] = "HHHH";
    //cout << "Please enter some info to add to the file" << endl;
    file.write((char*) &temp, 100);
    for(int i = 0; i < file.gcount(); i++){
        cout << temp[i];
    }
}

int main(int argc, char const *argv[])
{
    char buffer[BUF_SIZE];

    if (argc != 2){
        cout << "Program usage: prog_name file_name";
        return 1;
    }

    fstream file(argv[1], ios::in | ios::out | ios::binary | ios::app);
    if (!file){
        cout << "File can not open or doesn't exist";
        return 1;
    }

    //Try to read & write some info from/to file in particular position

    readFile(file, buffer);
    writeFile(file);

    file.close();

    return 0;
}
#包括
#包括
使用名称空间std;
常量int BUF_SIZE=1024;
void readFile(fstream&file,字符缓冲区[BUF_SIZE]);
无效写入文件(fstream和文件);
void readFile(fstream&file,字符缓冲区[BUF_SIZE])
{
内部位置;
cout位置;
文件.seekg(位置,ios::beg);

file.read((char*)缓冲区,BUF_SIZE);//我发现了几个问题:

  • 写入问题背后的原因可能是因为您到达了文件的末尾(文件是否小于
    BUF_SIZE
    bytes?)。这会设置EOF位,这会导致任何写入操作失败。您必须先清除该位(使用
    std::fstream::clear
    方法):

  • 最后,您总是要写入100个字符,可能包括缓冲区中的一些垃圾。正如我看到的,您希望让用户选择要写入的内容(注释行),您可以改为:

    const size_t size = strlen(temp);
    file.write(temp, size);
    for(size_t i = 0; i < size; i++){
        cout << temp[i];
    }
    
    您可能需要阅读以了解关于第一行的更多信息(基本上,它避免了在使用
    cin>>位置后跳过
    getline


  • 避免使用for循环来打印用户输入。对于缓冲区和
    std::string
    选项,您可以只
    cout如何知道
    writeFIle
    没有进行任何更改?顺便问一下(与您的问题无关),但是
    (char*)&temp
    是错误的。只使用
    temp
    或使用
    &temp[0]
    (两种情况下均无需浇铸)在
    writeFile
    中使用
    gcount
    没有任何意义:它是上次从文件中读取的字符数。我知道当我打开目标文件时,没有任何变化,如果我创建新的ostream它工作得很好谢谢你的详细响应,因为我正在学习。1.你能澄清一下设置EOF bit的操作吗?istream.read?我认为有两个独立的指针-一个用于读取,另一个用于写入操作(如seekp和seekg)想想看,这不对吗?是的,
    stream::read
    ;虽然指针是独立的,但文件的状态是由
    read
    write
    共享和检查的。2.好吧!一些程序员在评论中也告诉了我这一点。3.好吧!4.所有其他建议都是关于使用字符串类型的,我发现它在这里也更有用,THNX向Anton致意**“文件状态由读写双方共享和检查”**这是我的问题说明的真实答案!:1.“file.write(temp,100);”在gcc中不起作用,仅使用“file.write(&temp[0],100);“variant 2.”const size_t size=strlen(temp);“也不起作用,请使用“const size_t STR size=temp.size();”
    file.write(temp, 100);
    for(int i = 0; i < 100; i++){
        cout << temp[i];
    }
    
    const size_t size = strlen(temp);
    file.write(temp, size);
    for(size_t i = 0; i < size; i++){
        cout << temp[i];
    }
    
    cin.ignore(numeric_limits<streamsize>::max(), '\n'); // read the link bel
    string temp;
    getline(cin, temp); // need #include <string>
    file.write(temp.c_str(), temp.size());