我对C / C ++编程很陌生,我正在努力提高对文件i / o的理解。有了这个程序,我最初试图使myFile成为C中的typedef(显然不起作用),所以我转移到了C ++中的类(这就是为什么没有代码使用iostream)。
#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用于调试目的,以显示write()中的out的大小和内容,以及传递给它的fileInput:
8 : a b c Test a b c 18 : a b c Test a b c
很明显out小于fileInput,但包含相同的内容(?)令人困惑,因为我假设将被视为传递给write()的实际参数,因为out是指向fileInput的指针。 / p>
有什么办法可以解释出与fileInput完全相同的解释,还是我会以完全错误的方式解决这个问题?
答案 0 :(得分:2)
当我尝试将要写入文件(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");
答案 1 :(得分:0)
将char-array传递给write-method时,它将作为char-pointer传递。 sizeof-operator没有给出传递字符串的长度。而是使用像strlen这样的函数或将字符串的长度作为附加参数传递。
更好的解决方案是使用std :: string而不是char-arrays来传递字符串。