2013-12-10 3 views
0

Я довольно новичок в программировании на C/C++, и я стараюсь улучшить свое понимание ввода/вывода файлов. С этой программой я первоначально пытался сделать myFile typedef в C (что явно не сработало), поэтому я перешел на классы на C++ (поэтому ни один из кодов не использует iostream).Аргумент класса C++, отличный от класса, чем аргумент, переданный классу

#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(), это, кажется, работает, но файл, который он пишет содержит только первые 8 символов FileInput ,

Printf, размещенный для целей отладки, чтобы показать размер и содержание отказа в записи(), и FileInput, которая передается к нему:

 
8 : a b c Test a b c 

18 : a b c Test a b c 

Это становится очевидным, что из меньше, чем FileInput, но содержит то же содержимое (?), которое запутывает, как я предполагал, будет рассматриваться как фактический аргумент, переданный write(), поскольку out является указателем на fileInput.

Можно ли каким-либо образом интерпретироваться так же, как fileInput, или я об этом совершенно неправильно?

ответ

2

Когда я пытаюсь передать строку, я хочу, чтобы записать в файл (FileInput) в file1.write(), это, кажется, работает, но файл, который он пишет содержит только первые 8 символов FileInput.

Это из-за этого:

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 символов из ввода.

Что вам нужно сделать, это передать размер строки в качестве параметра. Или передайте объект с встроенным методом размера. Я бы использовал 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"); 
0

При передаче вашего символьного массива методу write он передается как указатель char. Оператор sizeof НЕ дает длину переданной строки. Вместо этого используйте функцию типа strlen или передайте длину вашей строки в качестве дополнительного параметра.

Еще лучше было бы использовать std :: string вместо char-array для передачи строк.

Смежные вопросы