Подсчитайте количество строк файла в Windows C - PullRequest
0 голосов
/ 13 марта 2011

У меня есть это:

#include "stdafx.h"
#include <windows.h>
#include <assert.h>




int _tmain(int argc, _TCHAR* argv[])
{
    LPCTSTR filePath = argv[1];
    DWORD numLines = _ttoi(argv[2]);

    HANDLE fileHandle = CreateFile(filePath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);


    DWORD fileSize = GetFileSize(fileHandle, NULL);

    TCHAR* file =  (TCHAR*)malloc(fileSize);
    DWORD bytesRead=0;

    ReadFile(fileHandle,file,fileSize,&bytesRead,NULL);

    DWORD numLinesFile = 0;
    for(DWORD i = 0;i<fileSize;i++)
        if(file[i] == '\n')
            numLinesFile++;



    free(file);
    CloseHandle(fileHandle);
    return 0;
}

, который возвращает 0 каждый раз, хотя длина файла на самом деле составляет 10 строк.

Ответы [ 2 ]

3 голосов
/ 13 марта 2011

sizeof(file) - размер переменной указателя file. Вы хотите передать Size на ReadFile

Вы можете также явно использовать char вместо TCHAR - если вы скомпилируете это с определением UNICODE, оно не будет работать, вы получаете доступ к нераспределенной памяти.

1 голос
/ 13 марта 2011

sizeof(file) эта часть неверна. Вы хотите поместить Size туда. sizeof(file) дает вам размер переменной file (которая соответствует размеру указателя, то есть 4 или 8 байт), а не размер самого файла.

Вы должны проверить возвращаемое значение ReadFile

В первой части кода вы используете переменную Size, во второй части - переменную fileSize. Это не выглядит правильно. Вы, конечно, не указали правильный размер fileSize в коде, который вы разместили. Напишите полный код компиляции, пожалуйста.

Кроме того, у вас есть проблема с размером символа. Если ваша программа скомпилирована как Unicode, тогда TChar станет широкоформатным (2 байта). Но вы относитесь к TChar как к байту.

И вы тоже не проверяете результат своего malloc. Это будет null, если файл слишком велик.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...