У меня проблемы с записью в файл в Windows? - PullRequest
0 голосов
/ 30 марта 2012

Я пытаюсь создать текстовый файл и записать в него, но когда я открываю текстовый файл, вывод получился неправильным.

Пример:

Please enter number of students?
2
Please Enter details of the Students in the Following sequence: Name Age GPA
alex  18 3.2
dan  21 3.5

Выход:

tttttttttkkkkkkkkksssssssssss

Код:

#include "stdafx.h"
#include<stdio.h>
#include<Windows.h>

struct Student {
    WCHAR name[20];
    int age;
    float gpa;
};

int _tmain(int argc, _TCHAR* argv[])
{
    struct Student St;
    int NumOfStu;
    printf("Please enter number of students\n");
    scanf("%d" , &NumOfStu);

    HANDLE f = CreateFile(L"d:\\SPR2.txt" , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS , FILE_ATTRIBUTE_NORMAL , NULL);
    if(f == INVALID_HANDLE_VALUE)
    {
        printf("Could not Create The File\n");
        return 0;
    }

    printf("Please Enter details of the Sutdents in the Following sequence: Name Age GPA\n");

    DWORD actual;

    for(int i=0 ;i<NumOfStu;i++)
    {
        scanf("%s %d %f" , &St.name , &St.age , &St.gpa );
        WriteFile(f ,  , sizeof(struct Student) , &actual , NULL); 
    }
    CloseHandle(f);

    return 0;
}

Ответы [ 3 ]

2 голосов
/ 30 марта 2012
    scanf("%s %d %f" , &St.name , &St.age , &St.gpa );

name уже распадается на указатель, вы не должны использовать & с ним.

Кроме того, это широкая строка, которую scanf не ожидает. Таким образом, вы получите коррупцию.

0 голосов
/ 30 марта 2012

В вашем вызове WriteFile есть опечатка: я не ожидаю, что это скомпилировано как есть.

Если вы исправили это, ваш вызов WriteFile

WriteFile(f , (LPCVOID)&St, sizeof(struct Student) , &actual , NULL); 

записывает все двоичное содержимое структуры. Это хорошо, если вы планируете читать его обратно таким же образом. Но это не имеет никакого смысла, если вы откроете файл в текстовом редакторе. Например, поле имени в Student будет записано в виде 20 широких символов, включая нулевое завершение после фактического содержимого и любой мусор, который мог остаться в памяти после завершения.

0 голосов
/ 30 марта 2012

В WriteFile, где находится lpBuffer?Похоже, вы пропустили этот параметр, и вы пишете значение указателя, как указано в другом ответе.

из WriteFileFunction

BOOL WINAPI WriteFile(
  __in         HANDLE hFile,
  __in         LPCVOID lpBuffer,
  __in         DWORD nNumberOfBytesToWrite,
  __out_opt    LPDWORD lpNumberOfBytesWritten,
  __inout_opt  LPOVERLAPPED lpOverlapped
);



  for(int i=0 ;i<NumOfStu;i++)
    {
        scanf("%s %d %f" , &St.name , &St.age , &St.gpa );
        WriteFile(f ,  , sizeof(struct Student) , &actual , NULL); 
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...