Как через цикл записать данные у текстовый файл?

Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Yevhenii Levchenko
3420
Yevhenii Levchenko  
Пробую так:

string names[]={"Petya", "Vasya", "Lena"};

int fileHandle=FileOpen("report.txt",FILE_READ|FILE_WRITE|FILE_TXT);
      
      if(fileHandle!=INVALID_HANDLE){
         for (int i=0; i<3; i++){
               
               FileWrite(fileHandle, names[i]);
               FileClose(fileHandle);
         }
         Comment("Данные успешно записаны");
      }else 
      PrintFormat("Не удалось открыть файл, Код ошибки = %d",GetLastError()); 

Но записывает только первый элемент. Вставлял в конце "\n" - не помогает. Подскажите как правильно записать отчет...

Georgiy Merts
9189
Georgiy Merts  

Ты ж сразу закрыл файл после первого элемента !

Yevhenii Levchenko
3420
Yevhenii Levchenko  
Georgiy Merts:

Ты ж сразу закрыл файл после первого элемента !

ааааа, ео-ма-ео... невнимательный

Спасибо! (тему можно закрывать)
Georgiy Merts
9189
Georgiy Merts  

Да и результат операции обязательно требует проверки...

Тебе зачем функция FileWrite() возвращает значение ? Почему оно не проверяется ? И если значение не равно требуемому, надо вызывать функцию GetLastError()

Yevhenii Levchenko
3420
Yevhenii Levchenko  
Georgiy Merts:

Да и результат операции обязательно требует проверки...

Тебе зачем функция FileWrite() возвращает значение ? Почему оно не проверяется ? И если значение не равно требуемому, надо вызывать функцию GetLastError()

типа так:

int writeErr= FileWrite(fileHandle, names[i]);
if (writeErr==0)
PrintFormat("ошибка во время записи. Код ошибки: %d",GetLastError()); 

Но при этом же будет запись продолжаться?

Georgiy Merts
9189
Georgiy Merts  
Yevhenii Levchenko:

типа так:

Но при этом же будет запись продолжаться?

Да, будет продолжаться, если сможет (вдруг у тебя на диске не хватает места ?).

Проверять лучше не по нулевому результату, а по записанной длине. Скажем, первые байты могут записаться, а дальше - места не хватит, возникнет ошибка, но программа этого не заметит, поскольку вернется ненулевое значение.

Yevhenii Levchenko
3420
Yevhenii Levchenko  
Georgiy Merts:

Да, будет продолжаться, если сможет (вдруг у тебя на диске не хватает места ?).

Проверять лучше не по нулевому результату, а по записанной длине. Скажем, первые байты могут записаться, а дальше - места не хватит, возникнет ошибка, но программа этого не заметит, поскольку вернется ненулевое значение.

А как это выглядит? Допустим, если данные массива имеют тип int. То, выходит, следующий вариант:


int writeErr= FileWrite(fileHandle, names[i]);
if (writeErr!=4)
PrintFormat("ошибка во время записи. Количество записанных байтов: %d Код ошибки: %d",writeErr, GetLastError()); 

Так?

Georgiy Merts
9189
Georgiy Merts  
Yevhenii Levchenko:
А как это выглядит? Допустим, если данные массива имеют тип int. То, выходит, следующий вариант:


Так?

Можно и так. Но, рекомендую сравнивать через sizeof()

Ihor Herasko
21177
Ihor Herasko  
Yevhenii Levchenko:
А как это выглядит? Допустим, если данные массива имеют тип int. То, выходит, следующий вариант:


Так?

Вместо 4 (если будете писать не строки) лучше использовать:

sizeof(<то, что записывается>)

Для записи строк вместо FileWrite лучше использовать FileWriteString. 

Yevhenii Levchenko
3420
Yevhenii Levchenko  
Georgiy Merts:

Можно и так. Но, рекомендую сравнивать через sizeof()

Ihor Herasko:

Вместо 4 (если будете писать не строки) лучше использовать:

Для записи строк вместо FileWrite лучше использовать FileWriteString. 

Как все интересно!) Спасибо!

Выходит так:

ResetLastError();
int writeErr= FileWrite(fileHandle, names[i]);
if (writeErr!=sizeof(names))
PrintFormat("Ошибка во время записи. Количество записанных байтов: %d Код ошибки: %d",writeErr, GetLastError()); 

Я так понимаю sizeof возвращает размер типа переменной? sizeof будет одинаковым для переменной типа int и массива (в т.ч. многомерного) типа int ?

Ihor Herasko:

Для записи строк вместо FileWrite лучше использовать FileWriteString. 

Для смешанной записи (string, int) - File Write только подходит?

Ihor Herasko
21177
Ihor Herasko  
Yevhenii Levchenko:
Как все интересно!) Спасибо!

Выходит так:

Я так понимаю sizeof возвращает размер типа переменной? sizeof будет одинаковым для переменной типа int и массива (в т.ч. многомерного) типа int ?

sizeof() вернет количество байт, соответствующих указанному типу данных. Для строки это всегда будет одно и то же значение, т. к. определяется только размер указателя на строку, а не длина строки:

   string sTest = "Какую строку не вводи, а получишь 12";
   Alert("Size of ", sTest, " is ", sizeof(sTest));

Результат:

2019.08.05 11:27:15.495 Test (NZDUSD,M1)        Alert: Size of Какую строку не вводи, а получишь 12 is 12

Для смешанной записи (string, int) - File Write только подходит?

Да, только FileWrite. Но тогда придется позаботиться о сериализации строк и их массивов. Наиболее простой вариант - StringToShortArray(). Но это не универсально. Нужно осторожно походить к таким моментам.

12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий