我在Windows中写入文件时遇到问题?

时间:2012-03-30 14:16:32

标签: c winapi file-io

我正在尝试创建一个文本文件并写入它,但是当我打开文本文件时输出错误。

样品:

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 个答案:

答案 0 :(得分:2)

    scanf("%s %d %f" , &St.name , &St.age , &St.gpa );

name已经衰减到指针,你不应该使用&

此外,它是一个宽字符串,scanf不期望。所以你会腐败。

答案 1 :(得分:0)

在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); 
    }

答案 2 :(得分:0)

你的WriteFile调用中有一个拼写错误:我不认为这是按原样编译的。

假设您已经更正了,那么您的WriteFile调用

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

正在编写结构的整个二进制内容。如果您打算以相同的方式阅读它,这很好。但是如果你在文本编辑器中打开文件就没有任何意义。例如,Student中的name字段将被写为20个宽字符,包括实际内容之后的空终止,以及终止后可能已经在内存中的任何垃圾。