我对C/C++编程很陌生,我正在努力提高对文件I/O的理解。这个程序最初是试图让Myfile成为C中的TyPulf(这显然不起作用),所以我转到C++中的类(这就是为什么没有一个代码使用IoSt流)。

#include <stdio.h>
#include <stdlib.h>


// required myFile.file=fopen("path","mode");
// read from file: myFile.read(char* out);
// write to file: myFile.write(char* in);
class myFile {
      public:
    FILE *file;

    void open(const char *path, const char *mode) {
        file=fopen(path,mode);
    }

    /*void read(char *out) {
        fread(out, sizeof(out[0]), sizeof(out)/sizeof(out[0]*sizeof(char)), file);
    }*/

    void write(char *in) {
        fwrite(in, sizeof(in[0]), sizeof(in)/sizeof(in[0]), file);
        printf("%i : %s\n",sizeof(in),in);
    }

};


int main(){
    myFile file1;
    file1.open("/path/test.txt", "w+b");
    char fileInput[]={"a b c Test a b c\n"};
    file1.write(fileInput);
    printf("%i : %s\n",sizeof(fileInput),fileInput);
    //fwrite(fIn, sizeof(fIn[0]), sizeof(fIn)/sizeof(fIn[0]), file1.file);
    //fprintf(file1.file,"a b c d Test a b c d\n");
    fclose(file1.file);
    return 0;
}

当我尝试将要写入文件(fileInput)的字符串传递给file1.write()时,它似乎可以工作,但它写入的文件只包含fileInput的前8个字符。
printf用于调试,以显示out in write()的大小和内容,以及传递给它的fileInput:
8:a b c测试a b c
18:a b c测试a b c
很明显out小于fileInput,但包含相同的内容(?)这很令人困惑,因为我假设out将被视为传递给write()的实际参数,因为out是指向fileInput的指针。
有没有什么方法可以让我理解为与fileInput完全相同,或者我是完全错误的方式来理解它?

最佳答案

当我尝试将要写入文件(fileInput)的字符串传递给file1.write()时,它似乎可以工作,但它写入的文件只包含fileInput的前8个字符。
这是因为:

write(in, sizeof(in[0]), sizeof(in)/sizeof(in[0]), file);

如果我们还查看函数头:
void write(char *in)

in具有char*类型。因此sizeof(in)将返回指针的大小(可能是8)。in[0]的类型为char,因此sizeof(in[0])将返回1。
所以这一行将从输入中写入8个字符。
您需要做的是将字符串的大小作为参数传递。或者传递一个内置size方法的对象。我将使用std::string作为参数(或者根据用法使用mabe std::vector)。
void write(std::string const& in) {
    fwrite(&in[0], 1, in.size(), file);
}

使用现在变成:
file1.write("hi there this is a message");

关于c++ - C++类的参数在类中与传递给类的参数不同,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20506641/

10-11 19:29