Pergunta

Estou tentando abrir um arquivo e ler isso .. mas estou tendo alguns problemas.

FILE *libFile = fopen("/Users/pineapple/Desktop/finalproj/test242.txt","r");
char wah[200];
fgets(wah, 200, libFile);
printf("%s test\n", wah);

Isso imprime: 377 376n teste em vez de qualquer um dos conteúdos do meu arquivo.

Alguma ideia do porquê?

Código completo:

#import <Cocoa/Cocoa.h>
#import <stdio.h>

int main(int argc, char *argv[])
{
NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];

FILE *libFile = fopen("/Users/pineapple/Desktop/finalproj/test242.txt","r");
if(libFile){
char wah[200];
fgets(wah, 200, libFile);
printf("%s test\n", wah);
    }
[pool drain];
return 0;

}

E o test242.txt não contém mais de 200 chars.

Foi útil?

Solução

Se for para Objective-C, por que não fazer algo como:

Use nsfilehandle:

NSString * path = @"/Users/pineapple/Desktop/finalproj/test242.txt";
NSFileHandle * fileHandle = [NSFileHandle fileHandleForReadingAtPath:path];
NSData * buffer = nil;
while ((buffer = [fileHandle readDataOfLength:1024])) {
  //do something with the buffer
}

ou use NSString:

NSString * fileContents = [NSString stringWithContentsOfFile:path encoding:NSUTF8StringEncoding error:nil];

ou se você precisar ler linha por linha:

Como ler os dados do NSFileHandle Line by Line?

IMO, não há necessidade de descer para as funções Fileio de nível C, a menos que você tenha um motivo muito muito bom para fazê-lo (ou seja, abrir um arquivo usando O_SHLOCK ou alguma coisa)

Outras dicas

Seu arquivo está armazenado em UTF-16 (Unicode). O primeiro caractere em seu arquivo é "L", que é o ponto de código 0x4c. Os 4 primeiros bytes do seu arquivo são FF FE 4C 00, que são uma marca de ordem de byte (BOM) e a letra L codificada no UTF-16 como dois bytes.

fgets não é consciente do Unicode, então está procurando o personagem Newline '\n', que é o byte 0x0a. Provavelmente, isso acontecerá no primeiro byte de um Unicode Newline (os dois bytes 0A 00), mas isso também pode acontecer em muitos outros caracteres não novas, como U+010a (letra capital latina A com ponto acima) ou qualquer coisa nos scripts Gurmukhi ou Gujarati (u+0a00 para u+0faf).

De qualquer forma, porém, os dados que acabam no buffer wah tem muitos nulos incorporados e parece algo como FF FE 4C 00 47 00 4F 00 4F 00 0A 00. NUL (0x00) é o terminador de string c, então, quando você tenta imprimir isso usando printf, ele para no primeiro nulo, e tudo o que você vê é \377\376L. \377\376 é a representação octal dos bytes FF FE.

A correção para isso é converter seu arquivo de texto em uma codificação de bytes, como ISO 8859-1 ou UTF-8. Observe que as codificações de bytes devem (exceto por UTF-8) não podem codificar toda a gama de caracteres Unicode; portanto, se você precisar do Unicode, recomendo fortemente o uso do UTF-8. Como alternativa, você pode converter seu programa para ter consciência do Unicode, mas não pode mais usar muitas funções de biblioteca padrão (como fgets e printf), e você precisa usar wchar_t em todos os lugares no lugar de char.

Se você não se importa de ler todo um arquivo, você pode fazer algo assim:

NSData* myData = [NSData dataWithContentsOfFile:myFileWithPath];

E então faça o que quiser com os dados a partir daí. Você receberá nulo se o arquivo não existir.

Se você estiver assumindo dados de texto (string) neste arquivo, também pode fazer algo assim e analisá -los como uma NSString:

NSString* myString = [[NSString alloc] initWithBytes:[myData bytes] length:[myData length] encoding:NSUTF8StringEncoding];

Como você mencionou que é relativamente novo no Objective-C, pode pesquisar bem bem. Dar uma olhada aqui Para mais informações sobre isso.

Eu também queria isso e pensei que "faça isso" não respondeu à pergunta, aqui está um exemplo de funcionamento abaixo. Cuidado que o FGES lê o delimitador n e anexa ao seu texto.

NSString * fName = [[NSBundle mainBundle] pathForResource:@"Sample" ofType:@"txt"];
FILE *fileHandle = fopen([fName UTF8String],"r");
char space[1024];
while (fgets(space, 1024, fileHandle) != NULL)
{
    NSLog(@"space = %s", space);
}

fclose(fileHandle);
 printf("%s test\n");

Você não está passando pela string para printf. Tentar

 printf("%s test\n", wah);

Além disso, se o seu arquivo contiver uma linha com mais de 200 caracteres, o FGES lerá 200 caracteres no Wah - então adicione um NUL ao fim, o que estará fora do final de Wah (já que você declarou 200 caracteres) e Will Will Transforme algo aleatório, e o comportamento do seu programa será indefinido e poderá incendiar o seu gato.

Slycrel entendeu. Expandindo essa resposta, aqui está outra maneira (na minha opinião, mais simples) de transformar esses dados em uma string:

NSString *myFileString = [[NSString alloc] initWithData:someData encoding:NSUTF8StringEncoding];

Isso declara uma nova NSString diretamente usando o NSData especificado.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top