我必须编写一个程序,每个程序分别读取数字。是否可以只读取文件的一行,然后从缓冲区中读取int
,依此类推,直到文件结束?很难找到使用读写的好例子。我的例子是有点工作,但我想阅读,直到它检测到'\n'
char,然后将缓冲区转换为int。
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <iostream>
int fd[2];
void readFile(int fd) {
unsigned char buffer[10];
int bytes_read;
int k=0;
do {
bytes_read = read(fd, buffer, 10);
k++;
for(int i=0; i<10; i++) {
printf("%c", buffer[i]);
}
}
while (bytes_read != 0);
}
int tab[50];
int main(int argc, char *argv[]) {
if(argv[1] == NULL || argv[2] == NULL) {
printf("Function requires two arguments!\nGood bye...\n");
return -1;
}
else {
if (access(argv[1], F_OK) == 0) {
fd[0] = open(argv[1], O_RDONLY);
}
else {
fd[0] = open(argv[1], O_WRONLY|O_CREAT|O_SYNC, 0700);
const int size = 50;
for(int i=0; i<size; i++) {
char buf[10];
sprintf(buf, "%d\n", i+1);
write(fd[0], buf, strlen(buf));
}
close(fd[0]);
fd[0] = open(argv[1], O_RDONLY);
if (access(argv[2], F_OK) == 0)
fd[1] = open(argv[2], O_WRONLY);
else
fd[1] = open(argv[2], O_WRONLY|O_CREAT, 0700);
}
}
if (access(argv[2], F_OK) == 0)
fd[1] = open(argv[2], O_WRONLY);
else
fd[1] = open(argv[2], O_WRONLY|O_CREAT, 0700);
readFile(fd[0]);
close(fd[0]);
close(fd[1]);
}
修订代码:
void readFile(int fd) {
char buffer[10];
int bytes_read;
int k = 0;
do {
char t = 0;
bytes_read = read(fd, &t, 1);
buffer[k++] = t;
printf("%c", t);
if(t == '\n' && t == '\0') {
printf("%d", atoi(buffer));
for(int i=0; i<10; i++)
buffer[i]='\0';
k = 0;
}
}
while (bytes_read != 0);
}
答案 0 :(得分:13)
Byte读取字节,如果不是'\n'
则检查每个字节,然后将其存储到buffer
中
如果'\n'
将'\0'
添加到缓冲区,然后使用atoi()
您可以像这样读取单个字节
char c;
read(fd,&c,1);
请参阅read()
答案 1 :(得分:0)
fgets会对你有用。这里有非常好的文档: - http://www.cplusplus.com/reference/cstdio/fgets/
如果您不想使用fgets,以下方法适用于您: -
int readline(FILE *f, char *buffer, size_t len)
{
char c;
int i;
memset(buffer, 0, len);
for (i = 0; i < len; i++)
{
int c = fgetc(f);
if (!feof(f))
{
if (c == '\r')
buffer[i] = 0;
else if (c == '\n')
{
buffer[i] = 0;
return i+1;
}
else
buffer[i] = c;
}
else
{
//fprintf(stderr, "read_line(): recv returned %d\n", c);
return -1;
}
}
return -1;
}
答案 2 :(得分:0)
我正在使用 read 从文件中读取一些数据。在这里,我正在读取 2d 字符指针中的数据,但该方法对于 1d 也是相同的。只需逐个字符读取,不要担心异常,因为 while 循环中的条件正在处理异常:D
while ( (n = read(fd, buffer,1)) > 0 )
{
if(buffer[0] == '\n')
{
r++;
char**tempData=(char**)malloc(sizeof(char*)*r);
for(int a=0;a<r;a++)
{
tempData[a]=(char*)malloc(sizeof(char)*BUF_SIZE);
memset(tempData[a],0,BUF_SIZE);
}
for(int a=0;a<r-1;a++)
{
strcpy(tempData[a],data[a]);
}
data=tempData;
c=0;
}
else
{
data[r-1][c]=buffer[0];
c++;
buffer[1]='\0';
}
}